Фон
Після застосування BWT (як це спостерігається у Burrows, Wheeler і Back ) та MTF (як це видно в Переміщенні на друкований фронт ASCII ), компресор bzip2 застосовує досить унікальну форму кодування довжиною пробігу.
Визначення
Для цієї задачі визначаємо перетворення BRLE наступним чином:
З огляду на рядок введення s, який складається виключно з символів ASCII з кодовими точками між 0x20 та 0x7A, виконайте наступне:
Замініть кожен пробіг рівних символів одним явищем символу та збережіть кількість повторень після першого.
Кодуйте кількість повторень після першого появи символу , використовуючи біективну нумерацію основи-2 та символи
{
та}
.Невід’ємне ціле число n кодується як рядок b k … b 0 таким, що n = 2 k i (b k ) +… + 2 0 i (b 0 ) , де i (
{
) = 1 і i (}
) = 2 .Зауважте, що це представлення завжди унікальне. Наприклад, число 0 кодується як порожній рядок.
Вставте рядок фігурних дужок, що кодує кількість повторень після одного появи відповідного символу.
Покроковий приклад
Input: "abbcccddddeeeeeffffffggggggghhhhhhhh"
Step 1: "abcdefgh" with repetitions 0, 1, 2, 3, 4, 5, 6, 7
Step 2: "" "{" "}" "{{" "{}" "}{" "}}" "{{{"
Step 3: "ab{c}d{{e{}f}{g}}h{{{"
Завдання
Реалізуйте інволютивну програму або функцію, яка зчитує окремий рядок зі STDIN або як аргумент командного рядка або функції та друкує або повертає або BRLE, або його зворотну рядок введення.
Якщо на вводі немає фігурних дужок, застосуйте BRLE. Якщо вхід містить фігурні дужки, застосуйте його обернену.
Приклади
INPUT: CODEGOLF
OUTPUT: CODEGOLF
INPUT: PROGRAMMING
OUTPUT: PROGRAM{ING
INPUT: PUZ{LES
OUTPUT: PUZZLES
INPUT: 444488888888GGGGGGGGGGGGGGGGWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
OUTPUT: 4{{8{{{G{{{{W{{{{{
INPUT: y}}}{{
OUTPUT: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
Додаткові правила
Ви не можете використовувати будь-які вбудовані модулі, які обчислюють BRLE або його обернену рядок.
Ви можете використовувати вбудовані модулі, які:
Обчисліть RLE або RLD рядка до тих пір, поки кількість повторень не буде збережено у біективної базі-2.
Виконайте перетворення будь-якого типу.
Ваш код може надрукувати наступний новий рядок, якщо ви виберете STDOUT для виводу.
Ваш код повинен працювати на будь-якому введенні 1000 або менше символів ASCII в діапазоні від 0x20 до 0x7A, а також фігурні дужки (0x7B і 0x7D).
Якщо вхід містить фігурні дужки, ви можете припустити, що це дійсний результат застосування BRLE до рядка.
Діють стандартні правила гольф-коду. Виграє найкоротше подання в байтах.