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이기 때문에 eIP가에서 위쪽으로 이동합니다. ?관련없는 모든 문자가 큐브에서 제거되었습니다.
. > 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가 읽기 / 쓰기 루프로 다시 들어 가려고하므로이 분기도 끝났습니다.