Cubix, 94 83 82 79 63 56 바이트
p>q'-?w.uh'e@U7.'hqi?oqB-!ul.-..$WWu_q<o'\;>....6t?.../!@
넓히는:
p > q '
- ? w .
u h ' e
@ U 7 .
' h q i ? o q B - ! u l . - . .
$ W W u _ q < o ' \ ; > . . . .
6 t ? . . . / ! @ . . . . . . .
. . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
노트
- 인터프리터는 프로그램이 시작될 때 입력 필드를 비활성화합니다. 따라서 무한한 입력 스트림이 불가능합니다. 이 프로그램은 문자별로 입력을 수행하므로이 제한이 없으면 제대로 작동합니다.
- 이 프로그램은 스택을 지우지 않으며 매우 지저분합니다. 이것에 사용될 머신은 분명히 무한한 입력 스트림을 줄 수 있기 때문에 무한한 메모리를 가지고 있다고 가정하는 것이 합리적입니다.
- 모든 골프 도움은 대단히 감사합니다.
온라인으로 사용해보십시오
당신은 여기 에서 프로그램을 시도 할 수 있습니다 .
설명
일반적인 생각
일반적인 아이디어는 문자를 읽고 다양한 문자 (먼저 h
, 그런 e
다음 l
등) 와 비교하여 확인하는 것 입니다. 우리가 놓친 캐릭터를 추적하기 위해 스택 맨 아래에 유지합니다. 필요할 때 쉽게 다시 맨 위로 가져올 수 있습니다.
읽기 / 쓰기 루프
읽기-쓰기 루프는 단순히 다섯 번째 줄입니다. 사용하지 않는 모든 문자는 no-ops ( .
) 로 바뀝니다 .
. . . .
. . . .
. . . .
@ . . .
' h q i ? o q B - ! u l . - . .
. . . . _ . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
이것은 읽기와 쓰기와 확인의 두 부분으로 나눌 수 있습니다. 첫 번째 부분에는 물음표까지의 지침이 포함되어 있습니다. 두 번째 부분은 나머지 줄입니다. 이것이 반복되기 때문에 스택 스택으로 시작한다고 가정합니다.[...]
@
'hqi?
_
Explanation
'h Push the character code of the h
Stack: [..., 104]
q Send it to the bottom
Stack: [104, ...]
i Read one character of the input (-1 for EOF)
Stack: [104, ..., input]
? Start of condition:
if (input < 0):
@ execute '@', ending the program
if (input = 0):
continue going right
if (input > 0):
_ turn to the right, reflect back ('_') and
turn right again, effectively not changing
the direction at all
두 번째 부분 (쓰기 및 확인)은 다시 선형입니다. 스택은로 시작합니다 [next-char, ..., input]
. 다음 문자는 프로그램에서 나중에 변경되기 때문에 다음 문자를 추상화했습니다.
oqB-!ul.- Explanation
o Output the character at the top of the stack
q Send the input to the bottom of the stack
Stack: [input, next-char, ...]
B Reverse the stack
Stack: [..., next-char, input]
- Push the difference of the top two characters, which
is 0 if both are equal, something else otherwise
Stack: [..., next-char, input, diff]
! if (diff = 0):
u make a u-turn to the right
else:
l. execute two no-ops
- push [input - next-char - input], which is disregarded
later, so it effectively is a no-op as well.
이제이 루프가 시작될 때 IP가 다시 시작되어 다음 문자를 재설정하여로 확인합니다 h
.
다음 캐릭터와 일치
IP가 u 턴을 한 경우 (즉, 읽고 인쇄 한 문자가 다음 문자와 일치 함 'hello'
) 입력 한 문자를 확인하고 그에 따라 다음 문자를 스택의 맨 아래로 밉니다. 그런 h
다음 스택으로 푸시하지 않고 읽기 / 쓰기 루프로 돌아 가야 하므로 다른 방법이 필요합니다.
먼저해야 할 일 : 입력 한 문자를 결정하십시오. 스택은 다음과 같습니다 : [..., prev-char, input, 0]
.
. . . .
- ? . .
u h ' e
. . . .
. . . . . . . . . ! u . . . . .
. . . . . . . . . \ ; . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
입력을 비교하기 위해 문자 코드를 h
다시 사용 합니다. 처음에 이것은 내가 어떻게 처리 할 것인지 알지 못했기 때문에 h
확인해야 할 첫 번째 문자이지만 매우 편리합니다. 우리가 입력에서 시간의 문자 코드를 빼면, 우리가 얻을 -3
입력이있는 경우 e
, 0
입력이 경우 h
, 4
입력 인 경우 l
및 7
입력이있는 경우 o
.
이 ?
명령을 사용하면 음수 값을 양수 값과 0에서 쉽게 분리 할 수 있기 때문에 유용 합니다. 따라서 IP가 왼쪽으로 바뀌면 차이가 음수이므로 입력이 e
이므로 다음 문자는이어야합니다 l
. IP가 계속 직진이라면 차이는 0
이므로 입력은 h
이므로 다음 문자는이어야합니다 e
. 입력이 l
또는 o
인 경우 IP가 오른쪽으로 바뀝니다.
위에서 언급 한 물음표 앞에 실행 된 모든 명령어는 다음과 같습니다.
;!e'h- Explanation
; Delete the top of the stack
Stack: [..., prev-char, input]
! if (input = 0):
e execute 'e' (no-op)
'h Push the character code of h
Stack: [..., prev-char, input, 104]
- Push the difference of the input and 104
Stack: [..., prev-char, input, 104, diff]
이제 IP는 위에서 설명한대로 방향을 바꿉니다. 다른 가능성을 살펴 보자.
입력 'e'
먼저 input을 고려하여 차이가 3이기 때문에 e
IP가에서 위쪽으로 이동합니다. ?
관련없는 모든 문자가 큐브에서 제거되었습니다.
. > q '
. ? . .
. . . .
. . . .
. . q . . . . . . . . l . . . .
$ W W . . . . . . . . > . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
문자는이 순서대로 실행됩니다 (일부 제어 흐름 문자 제외).
q'l$WWq
q Save the difference (-3) to the bottom of the stack so
we can tell whether the l on the bottom of the stack is
the first or the second l in hello
Stack: [-3, ...]
'l Push the character code of l to the stack
Stack: [-3, ..., 108]
$W no-op
W Sidestep into the loop
q Send the character code to the bottom
Stack: [108, -3, ...]
이제 IP가 읽기 / 쓰기 루프에 다시 도달했습니다.
입력 'h'
입력이 'h'
이면 차이는 0이므로 IP는 방향을 변경하지 않습니다. 모든 관련없는 문자가 제거 된 큐브가 다시 있습니다. 이 경로에는 꽤 많은 no-ops가 포함되어 있으므로 통과하는 모든 no-ops가로 대체되었습니다 &
. IP는 물음표에서 시작합니다.
. . . .
. ? w .
. . ' e
. . . .
. . . . . . . . . ! . . . . . .
. . . u _ q < . . \ . . . . . .
. . ? & & & / . . & . . . . . .
. . & . . . . . . & . . . . . .
. . . .
& & & &
. . . .
. . . .
실행되는 명령은 다음과 같습니다.
'e!\?q_
'e Push the character code of the e
Stack: [..., 101]
! if (101 = 0):
\ reflect away (effectively a no-op)
? if (101 > 0):
turn right (always happens)
q Move 101 to the bottom of the stack
Stack: [101, ...]
_ No-op
이제 우리는 다시 읽기 / 쓰기 루프로 들어가고 있습니다.
다른 입력
다른 모든 입력은 양의 차이를 가져 오므로 IP는 물음표에서 바로 바뀝니다. 우리는 여전히 l
와 를 분리해야 o
하므로 다음에 할 것입니다.
분리 'l'
및'o'
차이점은 7 o
과 4 의 차이이며 l
입력이 인 경우 프로그램을 종료해야합니다 o
. 여기에 관련이없는 부품이 a .
로 바뀌고 IP 교차가없는 no-ops가 앰퍼샌드로 바뀐 큐브가 다시 있습니다.
. . q .
. ? w .
. h ' .
. U 7 .
. . . . . . . . . . . . . - . .
. . . . . . . . . . . . . & . .
. . . . . . / ! @ . . . . & . .
. . . . . . & . . . . . . & . .
. . & .
. . & .
. . & .
. . & .
h7'wq-!@
h no-op
7 Push 7 to the stack
Stack: [..., diff, 7]
'wq Push w to the stack and send it to
the bottom. We don't care about it,
so it's now part of the ellipsis.
Stack: [..., diff, 7]
-! if (diff = 7):
@ End the program
두 'l'
s 사이의 식별
이제 입력 값이 l
임을 알았지 만 어느 것을 알지 못했습니다 l
. 첫 번째 경우 다른 l
스택을 맨 아래 로 밀어야 하지만 두 번째 인 경우을 눌러야합니다 o
. -3
첫 번째 푸시하기 직전에 스택의 맨 아래에 저장했음을 기억 l
하십니까? 이를 사용하여 두 가지를 분리 할 수 있습니다.
. . . .
. . . .
. . . .
. . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
6 t ? . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
스택은 다음과 같이 시작합니다 [..., -3 or 140, ...]
Explanation
6t?
6t Take the 6th item from the top and move
it to the top (which is either -3 or 140)
? If that's positive, turn right, otherwise,
turn left
먼저 'l'
이것이 처음이라면 'l'
, 우리는 다른 것을 밀어야합니다 'l'
. 바이트를 절약하기 위해 첫 번째와 동일한 문자를 사용합니다 'l'
. 스택을로 단순화 할 수 있습니다 [...]
. 다음은 큐브의 관련 부분이며 앰퍼샌드로 no-ops를 대체했습니다.
p > q '
. . . .
. . . .
. . . .
' . q . . . . . . . . l . . . .
$ W W . . . . . . . . > & & & &
. . ? . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
다음과 같은 명령이 실행됩니다.
$'pq'lq
$' no-op
pq no-op
'l Push the character code of l
Stack: [..., 108]
q Send it to the bottom
Stack: [108, ...]
우리는 읽기 / 쓰기 루프를 시작하려고하므로이 브랜치를 완료했습니다.
둘째 'l'
입력이 두 번째 인 경우 'l'
에서 'hello'
의 IP는 물음표에 바로 돌았 다. 다시 한번, 우리는 스택을 단순화 할 수 있고 이번에는 남쪽을 가리키는 [...]
IP가 시작합니다 ?
.
. . . .
. . . .
. . . .
. . . .
. . . . . . . . . . . . . . . .
. . . u _ q < o ' \ . . . . . .
. . ? . . . . . . & . . . . . .
. . & . . . . . . & . . . . . .
. . . .
& & & &
. . . .
. . . .
실행되는 명령은 다음과 같습니다.
'oq_
'o Push the character code of 'o'
Stack: [..., 111]
q Move the top item to the bottom
Stack: [111, ...]
_ No-op
그리고 IP가 읽기 / 쓰기 루프로 다시 들어 가려고하므로이 분기도 끝났습니다.