미로 , 28 25 24 23 22 바이트
" >
?!?:|}\{@
@\?"":)!
이것은 미친 재미이었다! :) 그것은 지금까지 내가 작성한 가장 조밀하게 압축 된 미로 프로그램입니다. 나는 20과 21 바이트에 너무 많은 버전을 가지고있어 거의 효과가 있었지만 여전히 이것이 최적인지 의심하고 있습니다 ...
입력은 양의 정수 목록 (임의의 구분 기호 포함) 으로 가져 와서 결과를 줄 바꿈으로 구분 된 정수로 STDOUT에 인쇄합니다.
20/21 바이트 사냥 : 나는 양식의 모든 프로그램을 확인했습니다.
" XX
?!?X}\{@
@\?XX)!
여기서 X
짐승 힘에 의한 합리적인 성격이지만, 유효한 해결책을 찾지 못했습니다. 물론 이것이 더 짧은 솔루션이 존재하지 않는다는 것을 의미하지는 않지만 20 바이트 프로그램을 구조에 대한 적절한 가정없이 강제로 할 수는 없습니다.
설명
(설명은 약간 구식이지만 솔루션이 최적이라고 확신하지 못하므로 업데이트를 기다릴 것입니다.)
따라서 일반적으로 미로 프로그램은 미로처럼 보일 것입니다. 명령 포인터가 복도에있는 동안 해당 복도를 따릅니다. IP가 모든 종류의 정션에 도달하면 방향은 Labyrinth의 기본 스택의 최상위 값을 기준으로 결정됩니다 (미로에는 두 개의 스택이 있으며 맨 아래에는 무한한 양의 0이 있음). 즉, 벽이 아닌 셀이 모든 곳에 연결되어 있으면 모든 것이 접합이며 대부분의 경우 스택의 상단에 IP에 대한 올바른 값이 없기 때문에 사소하지 않은 루프는 상당히 비쌉니다. 원하는 길을 가고 그래서 당신이하는 일은 루프를 확대하여 중앙에 하나의 잘 정의 된 진입 점과 출구 점이 각각 하나씩 있도록합니다.
그러나 이번에는 정말 운이 좋았고 모든 것이 잘 어울려서 하나의 큰 덩어리로 스쿼시 할 수있었습니다. :)
_
남쪽으로 가면서 제어 흐름이 시작됩니다 . 는 _
메인 스택에 0을 민다. 이는 작동하지 않는 것처럼 보이지만 1
나중에 필요 로 하는 ( 암시 적이 지 않은) 스택 깊이를 증가시킵니다 .
?
STDIN에서 정수를 읽습니다. 읽을 정수가 더 이상 없으면 0을 푸시합니다. 이 경우 IP는 계속 남쪽으로 이동 @
하고 입력 목록이 비어 있기 때문에 프로그램을 즉시 종료합니다. 그렇지 않으면 IP가 동쪽으로 바뀝니다.
우리는 이제 두 개의 출구 지점으로 매우 단단한 루프를 시작합니다.
!?;
\?
;
!
스택에 0 만 남기고 정수를 다시 STDOUT으로 인쇄합니다. IP는 계속 동쪽으로 이동 ?
하고 다음 정수를 읽습니다. 그것이 0이 아닌 경우 우회전하여 남쪽으로 이동합니다. ?
다른 것을 읽습니다 (다음 짝수 색인). 다시, 그것이 0이 아닌 경우, 우리는 오른쪽을 잡고 서쪽으로 움직입니다.
그런 다음 \
스택을 변경하지 않고 줄 바꿈을 인쇄하므로 오른쪽으로 이동하여 북쪽으로 이동합니다. !
그 다음 짝수 색인 정수를 인쇄합니다. 이제 스택에 하나 이상의 (양의) 홀수 인덱스 정수가 있으므로 계속 우회전하여 루프가 반복됩니다.
둘 중 하나가 ?
목록의 끝에 도달하면 0을 밀어 해당 해당 항목으로 바로 이동하여 해당 ;
0을 버립니다.
목록에 하나의 요소 만있는 경우 (우리가 즉시 인쇄했기 때문에) IP가 완료되었으므로 IP는 계속 동쪽으로 계속 이동 @
하여 프로그램을 종료합니다 (후행 인쇄) 길에 줄 바꿈).
그렇지 않으면 홀수 인덱스 정수도 인쇄해야합니다. 이 경우 두 경로 (첫 번째 루프의 두 출구 지점에서)가 가운데 "
에서 병합 되어 어느 쪽이든 동쪽으로 전환됩니다.
_
에 왼쪽을 복용하지 않도록 0을 밀어 @
및 ;
폐기 제로 그. 이제 우리는 새로운 루프를 입력합니다 :
"}
""
IP는 왼쪽 아래 셀에 이것을 입력하고 북쪽으로 이동하여 시계 방향으로 루프를 돌립니다. 는 }
보조 스택을 통해 주요 스택의 상단을 이동합니다. 스택에 여전히 요소가 있지만 IP는 계속 작동합니다. 모든 것이 보조 스택으로 이동되고 프로세스에서 반대로 바뀌면 IP는 계속 동쪽으로 이동하여 마지막 루프에 들어갑니다.
\{@
#!
\
줄 바꿈을 다시 인쇄 {
하고 보조 스택에서 주 항목으로 항목을 다시 이동합니다. 이 항목이 여전히 목록의 항목이면 양수이고 IP가 남쪽으로 바뀌고 항목이로 인쇄됩니다 !
. 그런 다음 #
스택 깊이를 밀어 (초기 어디 지금은 _
중요하다이 때문에, #
긍정적 인 스택 깊이를 보장)에 IP가 여전히 통해, 우회전 그래서, \
그리고 {
다시.
모든 것을 인쇄 한 후 {
보조 스택의 맨 아래에서 0을 가져 오면 IP는 동쪽을 계속 @
하고 프로그램을 종료합니다.