Фон
Преобразование « движение вперед» (MTF) - это алгоритм кодирования данных, разработанный для повышения производительности методов энтропийного кодирования.
В алгоритме сжатия bzip2 он применяется после преобразования Барроуза-Уилера (как видно из Барроуза, Уилера и Бэка ) с целью преобразования групп повторяющихся символов в маленькие, легко сжимаемые неотрицательные целые числа.
Определение
Для этой задачи мы определим версию MTF для печати в формате ASCII следующим образом:
Для данной входной строки s возьмите пустой массив r , строку d всех печатаемых символов ASCII (от 0x20 до 0x7E) и повторите следующее для каждого символа c из s :
Добавьте индекс c в d к r .
Переместите c в начало d , то есть удалите c из d и добавьте его к остатку.
Наконец, мы берем элементы r в качестве индексов в исходном d и выбираем соответствующие символы.
Пошаговый пример
INPUT: "CODEGOLF"
0. s = "CODEGOLF"
d = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = []
1. s = "ODEGOLF"
d = "C !\"#$%&'()*+,-./0123456789:;<=>?@ABDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35]
2. s = "DEGOLF"
d = "OC !\"#$%&'()*+,-./0123456789:;<=>?@ABDEFGHIJKLMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47]
3. s = "EGOLF"
d = "DOC !\"#$%&'()*+,-./0123456789:;<=>?@ABEFGHIJKLMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47 37]
4. s = "GOLF"
d = "EDOC !\"#$%&'()*+,-./0123456789:;<=>?@ABFGHIJKLMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47 37 38]
5. s = "OLF"
d = "GEDOC !\"#$%&'()*+,-./0123456789:;<=>?@ABFHIJKLMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47 37 38 40]
6. s = "LF"
d = "OGEDC !\"#$%&'()*+,-./0123456789:;<=>?@ABFHIJKLMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47 37 38 40 3]
7. s = "F"
d = "LOGEDC !\"#$%&'()*+,-./0123456789:;<=>?@ABFHIJKMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47 37 38 40 3 45]
8. s = ""
d = "FLOGEDC !\"#$%&'()*+,-./0123456789:;<=>?@ABHIJKMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47 37 38 40 3 45 41]
OUTPUT: "COEFH#MI"
задача
Напишите программу или функцию, которая реализует печатный ASCII MTF (как определено выше).
Контрольные примеры
Input: Programming Puzzles & Code Golf
Output: Prpi"do lp%((uz rnu&3!P/o&$U$(p
Input: NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN BATMAN!
Output: Na! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !!"DDUP"%'
Input: Two more questions and I have bzip2 in less than 100 bytes!
Output: Twp#o"si$sv#uvq(u$(l#o#W!r%w+$pz,xF%#,"x(. #0--'$GG ".z(**:
Дополнительные правила
Вы не можете использовать любой встроенный оператор, который вычисляет MTF строки.
Ваш код может напечатать завершающий символ новой строки, если вы выберете STDOUT для вывода.
Ваш код должен работать для любого ввода 1000 или менее печатных символов ASCII (от 0x20 до 0x7E).
Применяются стандартные правила игры в гольф. Самая короткая подача в байтах побеждает.