나선 , 점수 : 61921 5127 4715 4655 4191
4.X~>v+^#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v
X * X X X X X X X X X X X X X X X X X X X X X X X X X
! > h y t f V b n j u [ ( 1 3 2 ) ] U J N B F T Y H G
0;vgv*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*vvv****v+^v+^v+^v+^*v++4
X X X X X X X X X X X X X X X X X X X X X X X X X X
v v v v v v v v v v v v v v v v v v v v v v v v v v
Y y J F V u t U [ G H B n 3 N 2 j ) h g f ] ( 1 b T
통역사는 여기 에서 찾을 수 있습니다 .
설명:
P.X~ZZ*v+^#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v
X X X X X X X X X X X X X X X X X X X X X X X X X X
! h y t f V b n j u r d c m k i e s x l o w a z p q
0;vgv*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*****************************************************************vP
X X X X X X X X X X X X X X X X X X X X X X X X X X
v v v v v v v v v v v v v v v v v v v v v v v v v v
z y x w V u t s r q p o n m l k j i h g f e d c b a
프로그램은 0
네 번째 줄 의 문자에서 시작 합니다. 실행할 첫 번째 코드는 0;vg
입니다. ;
숫자를 입력으로 받아 스택에 넣습니다. v
레지스터 (제로)에있는 것을 스택에 넣습니다. 카운터로 사용됩니다. g
는 레이블에 도달하면 컨트롤 g
이 코드 에서 문자의 다른 발생으로 이동 합니다.
여기가 컨트롤이있는 곳입니다.
X
v
g
다른 모든 방향에는 공백이 있으므로 명령 포인터가 위로 이동하기 시작합니다.
v
스택에 0을 넣고 X
스택에서 즉시 팝합니다. 팝된 값이 0이므로 명령 포인터가로 이동합니다 X
(그렇지 않으면 공백으로 처리합니다).
기본적으로 제어 흐름은 우회전 모드이므로 정션에 도달하면 명령 포인터가 오른쪽으로 회전합니다. v
다시 스택에 0을 넣고 *
레지스터를 1 씩 증가시킵니다.
v*v*v
X
v
g
다음 v
은 레지스터 (번호 1)에있는 것을 스택에 배치하고 명령 포인터는 다음을 때리면서 오른쪽으로 회전하려고합니다 X
. 스택에 추가 된 값이 팝되어 레지스터에 배치됩니다. 0 X
이 아니므로 입력하지 않고 IP *
가 오른쪽 의 다음 으로 진행 하여 레지스터의 값을 다시 증가시킵니다.
v*v*v*v*v
X X X X X
v v v v v
i h g f e
이것은 우리가이 부분의 끝에 도달하고 *
s 의 라인이 시작될 때까지 계속해서 발생합니다 . 이제 레지스터의 값은 6이며 이는 ASCII 문자 g
에서 ASCII 문자를 뺀 것 a
입니다. 따라서 97 줄로 *
레지스터의 값을 103으로 증가시켜 g
인쇄하려는 문자와 일치시킵니다 . v
그것을 스택 에 넣고 코드의 첫 번째 줄에서 P
다른 레이블로 넘어갈 때 다른 레이블 P
입니다.
여기서 .
스택으로부터 값을 나타나고 문자로 출력한다. 그 후 X
스택에서 팝 불필요한 제로하고 ~
(값이 카운터의 입력 값이다) 스택의 나머지 두 값을 비교한다. 값이 동일하면 연산자는 스택에 0을 배치합니다 (그렇지 않으면 -1 또는 1). 다시, 컨트롤은 우회전을 시도합니다. X
스택에서 비교 값이 0이되면을 입력하고 입력 X
한 후 !
프로그램을 종료합니다.
P.X~ZZ*v+^
X
!
그렇지 않으면 IP Z
는이 레이블을 계속 유지합니다. 이 경우 레이블은 오른쪽으로 한 단계 만 이동합니다. 이렇게하는 이유는 점프가 레지스터의 값을 다시 0으로 설정하기 때문입니다. *
레지스터를 증가시키고 v
결과 1을 스택에 배치합니다. +
스택의 맨 위 두 요소 (1과 카운터)를 팝하고 추가 한 다음 결과를 스택에 배치합니다 (효과적으로 카운터가 1 씩 증가 함). ^
스택에서 결과를 제거하지 않고 스택에서 레지스터로 결과를 복사합니다.
#
레지스터의 값을 1 v
씩 감소시키고, 감소 된 값을 스택으로 푸시하고, IP는 오른쪽으로 회전을 시도 X
하고 스택에서 값을 팝합니다. 값이 0이 아닌 경우 IP는 계속 동쪽으로 이동하여 0에 도달 할 때까지 레지스터의 값을 감소시키고 IP는 X
지점으로 들어갑니다 .
#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v
X X X X X X X X X X X X X X X X X X X X X X X X X
h y t f V b n j u r d c m k i e s x l o w a z p q
분기는 카운터 값에 해당하는 레이블로 연결됩니다. 레이블에 도달하면 컨트롤은 레이블로 시작한 섹션에서 레이블의 다른 항목으로 이동하여 g
다른 반복을 시작합니다. 와 마찬가지로 g
레지스터의 값은 인쇄해야하는 문자의 ASCII 값까지 증가합니다. 그런 다음 문자가 인쇄되고 카운터가 증가하고 다른 레이블이 선택됩니다. 이것은 마지막 반복 이후에 카운터가 입력과 같아지고 프로그램이 종료 될 때까지 발생합니다.
편집하다:
P.X~Zv+^
X *
! Z
같은 것을 달성
P.X~ZZ*v+^
X
!
그러나 공백이 적습니다.
편집 2 :
vv****v+^v+^v+^v+^*v++P
다음 대신 사용할 수 있습니다 :
*****************************************************************vP