Фон
После применения BWT (как показано в Burrows, Wheeler и Back ) и MTF (как видно в Move на лицевой стороне ASCII для печати ) компрессор bzip2 применяет довольно уникальную форму кодирования длин серий.
Определение
Для этой задачи мы определим преобразование BRLE следующим образом:
Учитывая входную строку s, которая состоит исключительно из символов ASCII с кодовыми точками от 0x20 до 0x7A, выполните следующее:
Замените каждую серию одинаковых символов на одно вхождение символа и сохраните количество повторений после первого.
Кодируйте количество повторений после первого вхождения символа , используя биективную нумерацию base-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 строки, если количество повторений не сохранено в bijective base-2.
Выполните базовое преобразование любого вида.
Ваш код может напечатать завершающий символ новой строки, если вы выберете STDOUT для вывода.
Ваш код должен работать для любого ввода 1000 или менее символов ASCII в диапазоне от 0x20 до 0x7A, плюс фигурные скобки (0x7B и 0x7D).
Если входные данные содержат фигурные скобки, вы можете предположить, что это правильный результат применения BRLE к строке.
Применяются стандартные правила игры в гольф. Самая короткая подача в байтах побеждает.