인쇄 가능한 ASCII 앞면으로 이동 (에서 본 버로우 휠러 백 ) 작고

배경

이동 대 앞쪽 변환 (MTF), 엔트로피 인코딩 기술의 성능을 개선하기위한 데이터 암호화 알고리즘이다.

에서 의 bzip2 압축 알고리즘 , 이것은 이후에인가된다 버로우즈 – 휠러 변환 (에서 본 버로우 휠러 백 ) 작고 쉽게 압축 이외의 정수로 반복되는 문자 그룹을 선회 목적으로.

정의

이 과제를 위해 MTF의 인쇄 가능한 ASCII 버전을 다음과 같이 정의합니다.

입력 문자열을 감안할 빈 배열이 걸릴 R , 문자열 D 각 문자에 대해 다음 인쇄 가능한 모든 ASCII 문자 (0x7E가에가 0x20)를 반복 CS :

  1. d 에서 c 의 인덱스 를 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)를 입력해야합니다.

  • 표준 코드 골프 규칙이 적용됩니다. 바이트 단위의 최단 제출이 이깁니다.



답변

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


답변

타조 , 46 45 문자

실제로 최신 commit 일 뿐이므로 헤더에 버전 번호가 없습니다 . O최신 버전을 출시 한 후 (아스키 코드를 문자열에) 연산자를 추가했습니다 (그러나 여전히이 도전이 게시되기 전에).

{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)


답변

파이썬 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에 속합니다 🙂


답변

SWI-도입부 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 137 110 104

하지 구현하기 어려운,하지만이 되었습니까 어쩌면 아직도 golfable?

여기 사용해보십시오

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


답변

Pyth, 24 바이트

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

데모. 테스트 하네스.

첫 번째 비트. JK>95CM127필요한 목록을 설정하고이에 저장 J하고 K. 입력 문자를 목록의 해당 위치에 매핑하는 ~J+d-Jd동안 목록 업데이트를 수행합니다 xL ... z. 마지막으로 s@LK이러한 색인을 원래 목록의 문자로 변환합니다.


답변

하스켈, 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"

작동 원리 : #의 위치를 반환하는 인덱스 함수 es(하스켈의 기본을 사용할 수 elemIndex있기 때문에 고가의가 import). 주 함수 f는 접기 패턴을 따르며 입력 문자열을 통과 할 때 위치 문자열 d과 결과 문자열 r을 업데이트 합니다.