Фон
Перехід до переднього перетворенню (ФПЙ) являє собою дані , що кодує алгоритм призначений для підвищення продуктивності кодування ентропії методів.
В алгоритмі стиснення bzip2 він застосовується після перетворення Берроуз-Уіллера (як це спостерігається в Берроуз, Уіллер і Назад ), щоб перетворити групи повторних символів на невеликі, легко стислимі невід'ємні цілі числа.
Визначення
Для цього завдання, ми визначимо версію для друку ASCII MTF наступним чином:
При вхідного рядка s , візьміть порожній масив г , рядок d всіх символів ASCII друкуються (0x20 до 0x7E) і повторіть наступні дії для кожного символу з в е :
Додайте індекс 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).
Діють стандартні правила гольф-коду. Виграє найкоротше подання в байтах.