Двойное кодирование


9

Все знают, что такое кодирование длин серий. Это уже было предметом многих испытаний в гольф-коде. Мы будем смотреть на определенный вариант.

пример

Normal: 11222222222222222222233333111111111112333322
Run-length: 112(19)3(5)1(11)2333322

Число в скобках указывает, сколько раз встречался предыдущий символ. В этом примере были закодированы только серии из 5 или более символов. Это потому, что кодирование выполняется 4 или меньше, не улучшает количество символов.

Вызов

Напишите функцию / программу, которая реализует этот вариант кодирования длин серий, но также может кодировать серии из двух символов. Ряды двух символов также должны быть заключены в круглые скобки. Группа также будет заключена в круглые скобки. Ваша программа должна принять строку в качестве входных данных и вывести измененную строку с изменениями, которые сокращают строку.

пример

Normal: 111244411144411144411167676767222222277777222222277777123123123123
Double run-length: 1112((444111)(3))67676767((2(7)7(5))(2))123123123123

Ноты

  • 111не был закодирован, потому что кодировка it ( 1(3)) не короче.
  • Строка 444111встречается 3 раза, поэтому она кодируется.
  • 676767не был закодирован, потому что ((67)(4))длиннее, чем раньше.
  • 222222277777222222277777не был закодирован как ((222222277777)(2)). Почему? Потому что 222222277777сам можно свести к 2(7)7(5).
  • 123123123123 не закодирован, потому что ваша программа должна обрабатывать два символа, а не три.

Это так короткий код выигрывает. Тай-брейк является ранней подачей.


Если я что-то пропустил или если вы в чем-то не уверены, сообщите мне об этом в комментариях.


Но есть 4 67с.
Утренняя монахиня

Придется ли нам справляться 441444144414-> ((4414)(3))?
Утренняя монахиня

Я исправил это.
ericw31415

@KennyLau Нет, ты не будешь. 4414это технически серия 4. Моя формулировка просто плохая.
ericw31415

Может 111111111быть закодирован как (1)(9)?
CalculatorFeline

Ответы:


2

Сетчатка, 162 байта

+{`((\d)\2*(?!\2)(\d)\3*|\d)(?<1>\1)+
<<$1><$#1>>
<<([^<>]{1,7})><2>>
$1$1
<<([^<>]{1,3})><3>>
$1$1$1
<<([^<>]{1,2})><4>>
$1$1$1$1
}`<<(.)><(\d+)>>
$1($2)
T`<>`()

Попробуйте онлайн!


Если вы введете 10101010100100100100100, вывод будет ((10)(5))0((100)(4))еще на ((10)(4))((100)(5))один символ короче.
Марв

Вы действительно должны использовать такие маргинальные тестовые случаи ...
Leaky Nun

Да, это все самое интересное! : ^)
Марв

Забавно, что это единственный ответ на данный момент здесь.
ericw31415
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.