Подвійне кодування довжини виконання


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не було закодовано, оскільки кодування його ( 1(3)) не коротше.
  • Рядок 444111виникає 3 рази, тому він закодований.
  • 676767не було закодовано, оскільки ((67)(4))довше, ніж раніше.
  • 222222277777222222277777не було закодовано як ((222222277777)(2)). Чому? Тому що 222222277777себе можна звести до 2(7)7(5).
  • 123123123123 не закодовано, оскільки ваша програма повинна обробляти пробіги з двох символів, а не трьох.

Це є тому виграє найкоротший код. Автоматичний вимикач - це раннє подання.


Якщо я щось пропустив або якщо ви нічого не знаєте, будь ласка, повідомте мене в коментарях.


Але є 4 67с.
Leaky Nun

Чи доведеться нам впоратися 441444144414-> ((4414)(3))?
Leaky Nun

Я це виправив.
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.