미로 , 19 바이트
:?
:
#/)
\ #
!"*@
"
온라인으로 사용해보십시오!
그러면 C, B, A줄 바꿈으로 구분 된 순서대로 결과가 출력 됩니다.
설명
평소와 같이 짧은 미로 프라이머 :
- Labyrinth에는 main 과 aux (iliary) 라는 두 개의 임의 정밀도 정수 스택 이 있으며 처음에는 (암시 적) 무한한 양의 0으로 채워집니다. 이 답변에는 main 만 사용 합니다.
- 소스 코드는 미로와 유사하며, 명령 포인터 (IP)는 가능할 때 (모퉁이를 돌 때) 복도를 따라갑니다. 코드는 첫 번째 유효한 문자에서 읽기 순서로 시작합니다 (예 :이 경우 왼쪽 상단). IP가 어떤 형태의 접합 (즉, 여러 개의 인접 셀에서 나온 것)에 도달하면 메인 스택의 상단을 기준으로 방향을 선택합니다. 기본 규칙은 다음과 같습니다. 음수이면 왼쪽으로 돌리고 0이면 계속 진행하고 양수이면 오른쪽으로 돌리십시오. 벽이있어이 중 하나를 사용할 수없는 경우 IP는 반대 방향으로 진행됩니다. 데드 엔드를 칠 때 IP도 돌아갑니다.
"레이아웃을 약간 낭비하게 만드는 두 개의 no-ops ( ) 에도 불구하고 제어 흐름이 실제로 미묘하기 때문에이 솔루션에 매우 만족합니다.
IP는 :오른쪽 상단 왼쪽 모서리에서 시작합니다 . 프로그램은 즉시 막 다른 골목에 도달 ?하고 돌아서 프로그램이 실제로이 선형 코드 조각으로 시작합니다.
: Duplicate top of main stack. This will duplicate one of the implicit zeros
at the bottom. While this may seem like a no-op it actually increases
the stack depth to 1, because the duplicated zero is *explicit*.
? Read n and push it onto main.
: Duplicate.
: Duplicate.
즉 n, 기본 스택에 3 개의 사본이 있지만 깊이는 4입니다. 입력 복사본을 작업하는 동안 스택 배율을 사용하여 현재 승수를 검색 할 수 있기 때문에 편리합니다.
이제 IP가 (시계 방향) 3x3 루프에 들어갑니다. 참고 #스택 깊이를 밀어 어떤을, 항상 우리가 IP는 항상이 시점에서 동쪽으로 바뀝니다 알 수 있도록 양의 값을 밀어 것입니다.
루프 본문은 다음과 같습니다.
# Push the stack depth, i.e. the current multiplier k.
/ Compute n / k (rounding down).
) Increment.
# Push the stack depth again (this is still k).
* Multiply. So we've now computed (n/k+1)*k, which is the number
we're looking for. Note that this number is always positive so
we're guaranteed that the IP turns west to continue the loop.
" No-op.
! Print result. If we've still got copies of n left, the top of the
stack is positive, so the IP turns north and does another round.
Otherwise, see below...
\ Print a linefeed.
Then we enter the next loop iteration.
루프가 !세 번 (최대 ) 순회 된 후 모든 사본이 n모두 사용되며 그 아래에 0이 표시됩니다. 때문에에 "(그렇지 않으면 꽤 쓸모없는 것 같다) 하단에이 위치는 접합이다. 즉, 스택 상단에 0이 있으면 IP가 직진하려고합니다 (서쪽). 벽이 있기 때문에 실제로 180도 회전하고 막 다른 골목에 도달 한 것처럼 동쪽으로 돌아갑니다.
결과적으로 이제 다음 비트가 실행됩니다.
" No-op.
* Multiply two zeros on top of the stack, i.e. also a no-op.
The top of the stack is now still zero, so the IP keeps moving east.
@ Terminate the program.
C B A답변에 명확하게 지정된 경우 결과를 다른 순서로 (일관되게) 출력 할 수 있습니까 ?