이 과제는 구현되지 않은 esolang Pada 에서 느슨하게 영감을 얻었습니다 .
모두 0으로 초기화 된 8 비트 배열을 고려하십시오. 임의의 문자열을 인쇄하기위한 매우 최소한의 명령어 세트를 소개합니다 두 가지 명령이 있으며, 둘 다 N
비트의 인덱스 인 매개 변수 를 사용합니다.
t N
대한 t이 oggle :이 비트의 값을 변경합니다N
.p N
위한 P의 RINT : 바이트로서 해석이 모두 8 비트는 비트부터N
끝 주변 포장 . 이 바이트에 해당하는 문자가 STDOUT에 인쇄됩니다.
예를 봅시다. 인쇄하고 싶습니다 :=
. 순진하게 우리는 이것을 다음과 같이 달성합니다 (0 기반 비트 인덱스).
t 2 [0 0 1 0 0 0 0 0]
t 3 [0 0 1 1 0 0 0 0]
t 4 [0 0 1 1 1 0 0 0]
t 6 [0 0 1 1 1 0 1 0]
p 0 [0 0 1 1 1 0 1 0] == 58 == ':'
t 5 [0 0 1 1 1 1 1 0]
t 6 [0 0 1 1 1 1 0 0]
t 7 [0 0 1 1 1 1 0 1]
p 0 [0 0 1 1 1 1 0 1] == 61 == '='
그러나 대신 순환 기능을 사용 p
하고 두 가지 명령을 저장할 수 있습니다.
t 2 [0 0 1 0 0 0 0 0]
t 3 [0 0 1 1 0 0 0 0]
t 4 [0 0 1 1 1 0 0 0]
t 6 [0 0 1 1 1 0 1 0]
p 0 [0 0 1 1 1 0 1 0] == 58 == ':'
t 1 [0 1 1 1 1 0 1 0]
p 7 [0 1 1 1 1 0 1 0] == [0 0 1 1 1 1 0 1] == 61 == '='
^
따라서 p 7
첫 번째 비트 대신 마지막 비트에서 바이트 값을 읽기 시작합니다.
도전
비어 있지 않은 인쇄 가능한 ASCII 문자 (0x20 ~ 0x7E 포함) 문자열이 제공되면 위의 시스템으로 해당 문자열을 인쇄하기위한 최적의 명령 목록 (명령 당 한 줄)을 생성하십시오. 여러 개의 최적 솔루션이있는 경우 (거의 항상 발생 함) 그 중 하나만 생성하십시오.
비트에 대해 0 기반 및 1 기반 인덱싱 중에서 선택할 수 있지만 원하는대로 선택하십시오.
STDIN (또는 가장 가까운 대안), 명령 행 인수 또는 함수 인수를 통해 입력을 받고 STDOUT (또는 가장 가까운 대안), 함수 리턴 값 또는 함수 (out) 매개 변수를 통해 결과를 출력하는 프로그램 또는 함수를 작성할 수 있습니다. 결과를 STDOUT으로 인쇄하지 않으면 여전히 줄 바꿈으로 구분 된 단일 문자열이어야합니다.
이것은 코드 골프이므로 가장 짧은 대답 (바이트)이 이깁니다.
테스트 사례
각 테스트 케이스는 입력 문자열을 포함하는 단일 행이며, 최적의 명령 수와 하나의 가능한 솔루션이 이어집니다.
솔루션에 명령어 수를 출력 해서는 안됩니다. 여기에는 여기 만 포함되므로 다른 명령어 목록을 인쇄하는 경우 코드의 정확성을 확인할 수 있습니다.
?
7 instructions
t 2
t 3
t 4
t 5
t 6
t 7
p 0
:=
7 instructions
t 2
t 3
t 4
t 6
p 0
t 1
p 7
0123456789
26 instructions
t 2
t 3
p 0
t 7
p 0
t 6
t 7
p 0
t 7
p 0
t 5
t 6
t 7
p 0
t 7
p 0
t 6
t 7
p 0
t 7
p 0
t 2
t 3
p 3
t 2
p 3
9876543210
28 instructions
t 2
t 3
t 4
t 7
p 0
t 7
p 0
t 0
t 7
p 5
t 4
p 5
t 0
t 5
p 0
t 7
p 0
t 5
t 6
t 7
p 0
t 7
p 0
t 6
t 7
p 0
t 7
p 0
Hello, World!
39 instructions
t 1
t 4
p 0
t 3
t 7
p 2
t 1
t 6
p 2
p 2
t 0
t 1
p 2
t 0
t 1
t 3
p 2
t 6
t 7
p 2
t 0
t 2
t 6
t 7
p 1
t 0
t 1
t 5
p 0
t 2
t 7
p 3
t 2
t 6
p 0
t 4
p 0
t 1
p 3
The quick brown fox jumps over the lazy dog.
150 instructions
t 1
t 3
t 5
p 0
t 1
t 2
p 1
t 1
t 3
t 7
p 0
t 1
t 5
t 7
p 0
t 1
t 3
t 7
p 0
t 5
p 0
t 3
t 4
t 5
p 0
t 4
t 6
p 0
t 4
p 0
t 1
t 4
t 6
t 7
p 0
t 1
t 6
p 0
t 3
p 0
t 0
t 5
p 4
t 0
t 7
p 0
t 1
p 1
t 3
t 5
t 6
t 7
p 0
t 1
t 5
t 6
p 0
t 4
t 7
p 0
t 1
t 2
p 3
t 5
t 6
t 7
p 2
t 1
t 2
t 6
p 0
t 0
p 7
t 0
t 7
p 5
t 3
t 4
t 6
t 7
p 0
t 6
t 7
p 0
t 1
t 3
t 6
t 7
p 0
t 1
t 4
t 5
t 6
t 7
p 0
t 4
p 4
t 6
p 0
t 1
t 6
p 4
t 5
t 6
t 7
p 0
t 1
t 3
t 5
p 0
t 1
p 1
t 1
t 3
t 7
p 0
t 1
t 5
t 7
p 0
t 1
t 4
t 5
p 0
t 1
p 3
t 3
t 7
p 1
t 1
t 5
p 0
t 1
t 3
t 4
t 7
p 0
t 1
t 5
p 0
t 4
t 6
t 7
p 0
t 4
p 0
t 1
t 4
t 7
p 0
테스트 사례는이 CJam 참조 구현 으로 생성되었습니다 .
답변
CJam, 67 바이트
U]8*l{i2b8Ue[8,{1$m>2$.^:+}$0=_@m>@1$.^ee{~{"t "op}{;}?}/"p "o\p}/;
설명:
U]8* Build start bit array [0 0 0 0 0 0 0 0].
l Get input.
{ Start loop over input characters.
i Convert character to integer.
2b Convert to binary array.
8Ue[ Pad to 8 entries with leading 0.
8, Generate list of possible rotation amounts.
{ Start of sort function block.
1$ Get bit array of character.
m> Rotate by rotation amount.
2$ Get previous bit array.
.^ Element-wise xor to get different bits.
:+ Add elements in result to get count of different bits.
}$ Sort possible rotations by count of different bits.
0= Get first rotation amount in sorted list, which is the one with the
one that results in the smallest count of different bits.
_ Copy count. Will use original for "p" output later.
@ Get the character bit array to top of stack.
m> Rotate it, to get optimal rotated bit array.
@ Get previous bit array to top of stack.
1$ Copy rotated bit array, will need the original as starting point
for next character.
.^ Element-wise xor to get different bits.
ee Enumerate array to get pairs of index and bit value.
{ Loop over bits.
~ Unpack index bit pair.
{ Start of if block for bit value.
"t "o Output "t ".
p Output index and newline.
} End of if block.
{ Start of else block.
; Pop the index value.
}? End of ternary if.
}/ End loop over bits.
"p "o Output "p ".
\ Swap rotation amount to top.
p Print rotation amount and newline.
}/ End loop over input characters.
; Ppp current bit array off stack to prevent extra output.
답변
루비, 171
->w{s=[0]*8
w.chars.flat_map{|c|z=0..7
*m,i=z.map{|j|z.select{|k|s[k]!=z.map{|i|c.ord[i]}.rotate(j)[k]}<<j}.min_by &:size
m.map{|m|s[m]=1-s[m];"t #{7-m}"}+["p #{i}"]}*?\n}
참조 구현 크기의 두 배에 불과한 Ruby 함수입니다 . 🙂
온라인으로 사용해보십시오 : http://ideone.com/ysYyFP
이 프로그램은 매우 간단합니다. 8 비트를 0으로 설정하고 문자를 반복합니다. 각 단계에서 현재 상태에서 문자를 인쇄 할 수있는 상태로 가장 짧은 경로를 사용합니다. 지정된 형식으로 문자열을 반환합니다.
답변
CJam, 81 76 바이트
아직도 골프를 많이합니다.
0]8*q{i2b8Te[8,\fm>:X\_@\f.=::+_$W=#:YX=_@.{=M['tSUN]?U):U;}o0:U;['pSYN]o}/;