배경
이동 대 앞쪽 변환 (MTF), 엔트로피 인코딩 기술의 성능을 개선하기위한 데이터 암호화 알고리즘이다.
에서 의 bzip2 압축 알고리즘 , 이것은 이후에인가된다 버로우즈 – 휠러 변환 (에서 본 버로우 휠러 백 ) 작고 쉽게 압축 이외의 정수로 반복되는 문자 그룹을 선회 목적으로.
정의
이 과제를 위해 MTF의 인쇄 가능한 ASCII 버전을 다음과 같이 정의합니다.
입력 문자열을 감안할 의 빈 배열이 걸릴 R , 문자열 D 각 문자에 대해 다음 인쇄 가능한 모든 ASCII 문자 (0x7E가에가 0x20)를 반복 C 의 S :
-
d 에서 c 의 인덱스 를 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)를 입력해야합니다.
-
표준 코드 골프 규칙이 적용됩니다. 바이트 단위의 최단 제출이 이깁니다.
답변
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"
작동 원리 : #
의 위치를 반환하는 인덱스 함수 e
에 s
(하스켈의 기본을 사용할 수 elemIndex
있기 때문에 고가의가 import
). 주 함수 f
는 접기 패턴을 따르며 입력 문자열을 통과 할 때 위치 문자열 d
과 결과 문자열 r
을 업데이트 합니다.