미로 , 40 바이트
<
,,}:?
.
;(" {(={}{".
,",;=};} }) "{@
입력 N
뒤에 숫자가 아닌 문자로 구분 된 문자열이옵니다.
온라인으로 사용해보십시오!
이것은 Sp3000과 공동으로 작성되었습니다. (알고리즘을 알아 내기 위해 귀찮게 할 수 없었기 때문에 알고리즘을 개발하기 시작했으며 118 바이트 솔루션을 제안했지만 골프를 타지 못했습니다. 그래서 골프를 쳤습니다. .. 팀워크를위한 예).
설명
Sp의 일반적인 프라이머 (보통 약간 수정 된대로) :
- Labyrinth는 기본 및 보조의 두 스택이있는 스택 기반 2D 언어입니다. 거의 모든 것이 기본 스택에서 발생하지만 값을 다른 값으로 이동하여 값을 바꾸거나 나중에 저장할 수 있습니다.
- 스택은 밑이없고 0으로 채워 지므로 빈 스택에서 터지는 것은 오류가 아닙니다.
- 첫 번째 유효한 문자 (여기서는 왼쪽 위)부터 실행이 시작됩니다. 명령어 포인터 (IP)가 취할 수있는 두 개 이상의 가능한 경로가있는 각 접점에서 스택의 맨 위를 확인하여 다음에 갈 곳을 결정합니다. 음수는 왼쪽이고, 0은 앞으로 가고 양수는 오른쪽입니다. 이는 동안 의미 , 구불 구불 한 구절 권선과 같은 코드를 보이게하기 위해, 이러한 조건은 모든 세포에 체크 "방"을 만들기에서 당신을 중지 아무것도 없다. 그것들은 예측할 수없는 행동을 낳을 수 있지만 골프에는 좋습니다.
- 소스 코드 (따라서 미로의 레이아웃)는
<>^v
행이나 열 또는 그리드를 주기적으로 이동하는 런타임을 사용하여 수정할 수 있습니다 .
"
아니야.
여기 있습니다
코드는에서 <
시작합니다. 긴 선형 코드로 시작할 때 몇 번 사용했던 골프 트릭입니다. 첫 번째 행을 주기적으로 왼쪽으로 이동하고 IP가 켜져 있으므로 소스는 다음과 같습니다.
<
,,}:?
.
;(" {(={}{".
,",;=};} }) "{@
그러나 이제 IP는 어디로도 이동할 수 없으므로 <
다시 실행 됩니다. 이 상태에 도달 할 때까지 계속됩니다.
<
,,}:?
.
;(" {(={}{".
,",;=};} }) "{@
이 시점에서 IP는 셀에서 나가고에서 시작하여 두 번째 줄을 실행할 수 있습니다 ?
. 선형 코드는 다음과 같습니다.
? # Read the first integer on STDIN, i.e. N.
:} # Duplicate it and move one copy over to the auxiliary stack.
, # Read the separator character.
,. # Read the first character of the input string and directly print it.
이제 IP가이 3x2 공간으로 들어갑니다. 실제로 2 개의 압축 압축 된 2x2 시계 방향 루프입니다. 첫 번째 루프 N-1
는 STDIN에서 문자를 읽고 버립니다 .
; # Discard the top of the stack. On the first iteration, this is the
# separator we've already read. On subsequent iterations this will be
# one of the N-1 characters from the input string.
( # Decrement N. If this hits zero, we leave the loop, otherwise we continue.
, # Read the next character from STDIN to be discarded.
이제 입력 문자열의 나머지를 읽는 두 번째 루프에 들어갑니다. 때문에 우리는 EOF를 감지 할 수 있습니다 ,
반환 -1
하는 경우에 IP가 좌회전하고,.
, # Read a character. Exit the loop if EOF.
( # Decrement it.
이 감소는 실제로는 유용하지 않지만 나중에 무료로 취소 할 수 있으며 여기서 두 루프를 겹칠 수 있습니다.
우리가 가지고가는 경우에 5 ABCDEFGHIJKLMNOP
예를 들어 입력, 스택의 모습이 맘에 :
Main [ ... 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' 'N' 'O' -1 | 5 ... ] Auxiliary
실제로는 입력 문자에 해당하며 FGHIJKLMNOP
(감소했기 때문에) 실제로 첫 번째 N-1
문자 를 인쇄하고 싶지 않습니다 ( 문자 는 버렸지 만 건너 뛰고 싶습니다 N
).
이제 다음 루프를 위해 스택을 준비하는 짧은 선형 비트가 있습니다.
; # Discard the -1.
= # Swap the tops of the stacks, i.e. N with the last character.
# By putting the last character on the auxiliary stack, we ensure that
# it doesn't get discarded in the next loop.
} # Move N over to the auxiliary stack as well.
이제 스택은 다음과 같습니다.
Main [ ... 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' 'N' | 5 'O' ... ] Auxiliary
또 다른 2x2 시계 방향 루프로 들어갑니다. N
메인 스택에서 최상위 문자를 버립니다 .
; # Discard the top of the main stack.
{ # Pull N over from the auxiliary stack.
( # Decrement it. It it's 0 we leave the loop.
} # Push N back to the auxiliary stack.
우리는 루프 종료하면 =
그 스왑 0
다시 입력 문자열의 마지막 문자를. 이제 스택은 다음과 같습니다.
Main [ ... 'E' 'F' 'G' 'H' 'I' 'O' | ... ] Auxiliary
왼쪽에서 메인 스택의 내용을 인쇄하려고합니다 (하단 요소는 제외하고 모두 1 씩 증가) . 즉, 보조 스택으로 가져와야합니다. 이것이 다음 2x2 (시계 방향) 루프가하는 일입니다.
{ # Pull an element over from the auxiliary stack. This is necessary so we
# have a 0 on top of the stack when entering the loop, to prevent the IP
# from turning right immediately.
} # Move the top of the main stack back to the auxiliary stack. If this was the
# bottom of the stack, exit the loop.
) # Increment the current character.
} # Move it over to the auxiliary stack.
지금 스택 :
Main [ ... | 'F' 'G' 'H' 'I' 'J' 'P] ... ] Auxiliary
를 사용하여 첫 번째 항목 (인쇄하지 않으려는 항목)을 다시 기본 스택으로 옮깁니다 {
. 그리고 이제 마지막 2x2 ( 반 시계 방향 ) 루프를 입력 하면 나머지가 인쇄됩니다.
{ # Pull another character over from the auxiliary stack. Exit the loop
# if that's the zero at the bottom of the stack.
. # Print the character.
마지막으로로 프로그램을 종료합니다 @
.
'
카운팅 캐릭터 와 같이 N을 단항으로 가져도 괜찮 습니까? 예를 들면 다음과 같습니다.''123321
?