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

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 не закодирован, потому что ваша программа должна обрабатывать два символа, а не три.

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


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

ericw31415
источник
Но есть 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