CJam, 25-25 = 0 바이트
q~1,*_@{[\{1$^}/_](;)\}/;
Martin Büttner의 답변 을 읽은 후 CJam의 정수 및 문자 유형 처리로 인해 1 바이트를 절약 할 수 있다는 것을 알았 으므로 이것은 아래 GolfScript 답변의 직선 CJam 포트입니다 . (기본적으로 CJam은 1&
GolfScript 코드에서 ASCII 문자를 비트로 강제 하는 데 사용될 필요는 없지만 q
입력을 읽는 데 선행을 요구합니다 .) 일반적으로 그러한 사소한 포트를 저렴한 트릭으로 생각하지만 점수는 0으로 만듭니다. 가치있는 IMO.
어쨌든이 프로그램은 아래의 원본 GolfScript 프로그램과 동일하게 작동하므로 설명 및 사용 지침을 참조하십시오. 평소와 같이이 온라인 인터프리터를 사용하여 CJam 버전을 테스트 할 수 있습니다 .
GolfScript, 26 − 25 = 1 바이트
~1,*.@{[1&\{1$^}/.](;)\}/;
이 솔루션은 입력 문자열을 한 번만 반복하므로 −25 바이트 보너스를받을 자격이 있다고 생각합니다. 그것은 각각의 k 사전- 테이트 레이트의 현재 비트를 저장 하는 k- 요소 배열을 내부적으로 유지함으로써 작동한다 .
입력은 stdin을 통해 형식으로 "1111111" 3
, 즉 따옴표로 묶은 문자열 0
과 1
문자, 숫자 k로 제공해야 합니다. 따옴표가없는 비트 열로 출력됩니다.
이 코드를 온라인으로 테스트하십시오. (프로그램 시간이 초과되면 다시 실행 해보십시오. Web GolfScript 서버는 임의 시간 초과로 악명이 높습니다.)
다음은이 프로그램의 확장 된 버전과 설명입니다.
~ # eval the input, leaving a string and the number k on the stack
1,* # turn the number k into an array of k zeros ("the state array")
. # make a copy of the array; it will be left on the stack, making up the
# first k bits of the output (which are always zeros)
@ # move the input string to the top of the stack, to be iterated over
{
[ # place a start-of-array marker on the stack, for later use
1& # zero out all but the lowest bit of this input byte
\ # move the state array to the top of the stack, to be iterated over
{ 1$^ } / # iterate over each element of the state array, XORing each
# element with the previous value on the stack, and leave
# the results on the stack
. # duplicate the last value on the stack (which is the output bit we want)
] # collect all values put on the stack since the last [ into an array
(; # remove the first element of the array (the input bit)
) # pop the last element (the duplicated output bit) off the array
\ # move the popped bit below the new state array on the stack
}
/ # iterate the preceding code block over the bytes in the input string
; # discard the state array, leaving just the output bits on the stack
기본적으로 대부분의 반복 솔루션과 마찬가지로이 코드는 반복을 적용하는 것으로 이해 될 수 있습니다.
b i , j : = b i , ( j -1) ⊕ b ( i -1), ( j -1) ,
여기서 b 0, j 는 j 번째 입력 비트 ( j ≥ 1의 경우), b k , j 는 j 번째 출력 비트, b i , 0 = 0입니다. 차이점은 반복적 인 솔루션은 사실상 반복적으로 "행 단위"(즉, 첫 번째 b 1, j 는 모든 j , b 2, j 등)를 계산하지만이 솔루션은 대신 "열 기준"을 계산한다는 점입니다. 열 "(또는보다 정확하게는"대각선에 의한 대각선 "), 먼저 계산 b i , i 1 ≤ i≤ K 후 B 나 , 나는 한 후, B I , I +2 등
이 방법의 한 가지 (이론적) 장점은 원칙적으로이 방법이 O ( k ) 스토리지 만 사용하여 임의로 긴 입력 문자열을 처리 할 수 있다는 것 입니다. 물론 GolfScript 인터프리터는 프로그램을 실행하기 전에 모든 입력을 메모리에 자동으로 읽어 들여 대부분의 이점을 무시합니다.