Перемістіться до друку ASCII спереду


19

Фон

Перехід до переднього перетворенню (ФПЙ) являє собою дані , що кодує алгоритм призначений для підвищення продуктивності кодування ентропії методів.

В алгоритмі стиснення bzip2 він застосовується після перетворення Берроуз-Уіллера (як це спостерігається в Берроуз, Уіллер і Назад ), щоб перетворити групи повторних символів на невеликі, легко стислимі невід'ємні цілі числа.

Визначення

Для цього завдання, ми визначимо версію для друку ASCII MTF наступним чином:

При вхідного рядка s , візьміть порожній масив г , рядок d всіх символів ASCII друкуються (0x20 до 0x7E) і повторіть наступні дії для кожного символу з в е :

  1. Додайте індекс c в d до r .

  2. Перемістіть 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).

  • Діють стандартні правила гольф-коду. Виграє найкоротше подання в байтах.


1
"Нанананана DDUP!" просто не такий привабливий, як "Бетмен!" ...
Doorknob

8
@Doorknob: Але Бетмен не легко стисливий.
Денніс

Чи можемо ми вивести результат у поверненні функції замість того, щоб друкувати її в STDOUT?
Фаталізувати

@Fatalize: Це найбільш природна форма виводу для функцій, так що так. До речі, у нас є стандартні параметри для вводу-виводу , тому, якщо питання прямо не говорить інше, це завжди дозволено.
Денніс

Відповіді:


6

CJam, 20

'¡,q{_C#c' ,C+@|}fC;

Спробуйте в Інтернеті

Пояснення:

'¡,      make a string of characters with codes from 0 to 160 (a modified "d")
         could have been to 126 but stackexchange doesn't like the DEL character
q        read the input (s)
{…}fC    for each character C in s
  _      duplicate the d string
  C#     find the index of C in d
  c      convert to character (this is the result)
  ' ,    make a string of characters from 0 to 31
  C+     append C to the string
  @      bring d to the top
  |      set union, preserving order; effectively, C is moved to position 32
         this is the updated d string
;        pop the last d

6

Страус , 46 45 годин

Немає номера версії у заголовку, оскільки це насправді лише остання фіксація . Я додав Oоператора (код ascii до рядка) після виходу останньої версії (але ще до того, як цей виклик був розміщений).

{a95,{32+O}%:d3@{:x\.3@?3@\+\x-x\+}/;{d=}%s*}

Пояснення:

a             this is the "r" array (a is short for [], empty array)
95,{32+O}%:d  this is the "d" array
3@{...}/      for each character in the input (as an "argument")...
  :x            store in variable x (stack is now [r d c])
  \.3@?         find index in d     (stack is now [r d idx])
  3@\+          append index to r   (stack is now [d modified_r])
  \x-           remove char from d, and then...
  x\+           prepend char to d   (stack is now [modified_r modified_d])
;             throw away modified_d
{d=}%         map r to indices of (original) d
s*            join (s is short for ``, empty string)

Мені цікаво, чи PPCG переходить від "кодуйте це завдання максимально стислим способом на улюбленій мові" до "розробити власну мову програмування, щоб вирішити типову задачу для гольфу коду, коротшу, ніж golfscript"
Джон Дворак

1
@AlexA. ... зачекайте, так, написано саме так? все моє життя було брехнею
Doorknob

@JanDvorak Ostrich майже ідентичний GolfScript. Єдина реальна причина, яку я створив, це тому, що: a) у GolfScript дратівливо немає REPL і b.) Є кілька відсутніх операторів / функцій (плаваюча точка, введення / виведення тощо). І мовний дизайн все одно веселий!
Дверна ручка

3

Пітон 3, 88

*d,=range(127)
for c in input():y=d.index(ord(c));d[:32]+=d.pop(y),;print(chr(y),end='')

Використання деяких ідей з мого рішення CJam.
-4 байти належать до Sp3000 :)


2

SWI-Prolog, 239 197 189 байт

a(S):-l([126],X),a(S,X,[],R),b(R,X).
a([A|T],X,S,R):-nth0(I,X,A,Z),(a(T,[A|Z],[I|S],R);R=[I|S]).
b([A|T],X):-(b(T,X);!),nth0(A,X,E),put(E).
l([B|R],Z):-A is B-1,X=[A,B|R],(A=32,Z=X;l(X,Z)).

Приклад: a(`Two more questions and I have bzip2 in less than 100 bytes!`).виходи:

Twp#o"si$sv#uvq(u$(l#o#W!r%w+$pz,xF%#,"x(. #0--'$GG ".z(**:

true .після цього, очевидно)

Примітка. Ваша версія SWI-Prolog повинна бути однією з нових версій, в якій зворотне котирування `представляє рядки коду. Рядки коду використовувалися для подвійних лапок "у старих версіях.


2

Пітон 2, 137 110 104

Це було не важко втілити, але, можливо, все-таки пограбували?

Спробуйте тут

e=d=map(chr,range(32,127))
r=""
for c in raw_input():n=e.index(c);r+=d[n];e=[e[n]]+e[:n]+e[n+1:]
print r

1
Я думаю, що вам краще зробити карту списку e=d=map(chr,range(32,127))на Python 2, хоча вам доведеться налаштувати eобробку списку.
xnor

@xnor Дякую Я також спробував використовувати e=[e.pop(n)]+e, але це не працює. Чому так?
mbomb007

У тебе є e=d=, тож коли ти eвискакуєш, ти теж вискакуєш d. Спробуйте d=e[:].
Sp3000

1
Але в цей момент, мабуть, краще просто зробити n=e.index(ord(c));r+=chr(n+32);і кинутиd
Sp3000

1

Pyth, 24 байти

JK>95CM127s@LKxL~J+d-Jdz

Демонстрація. Тестовий джгут.

Перший шматочок. JK>95CM127встановлює необхідний список і зберігає його до Jта K. ~J+d-Jdвиконує оновлення списку, при цьому xL ... zвідображає вхідні символи на їхні позиції у списку. Нарешті, s@LKперетворює ці індекси в символи у вихідному списку.


1

Haskell, 120 байт

e#s=[b|(b,a)<-zip[0..]s,a==e]!!0
a=[' '..'~']
f=snd.foldl(\(d,r)e->(e:take(e#d)d++tail(drop(e#d)d),r++[a!!(e#d)]))(a,[])

Приклад використання: f "CODEGOLF"->"COEFH#MI"

Як це працює: #це функція індексу, яка повертає позицію eв s(не може використовувати рідну Haskell elemIndexчерез дороге import). Основна функція fслідує за схемою складання, де вона оновлює рядок позиції dта рядок результатів rпід час проходу через рядок введення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.