나선 , 점수 : 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