Cubix, 238 234 217 151 110 100 바이트
ETHProductions 덕분에 14 바이트 절약
u'^.:s+.;;;\-?W?rsos\(rrOIO:ur>'=o;^u.;;.>$.vUo^'rsu1;;@!\q?s*su;;IOu*+qU../;(*\(s.;<..r:''uq....qu\
넓히는:
u ' ^ . :
s + . ; ;
; \ - ? W
? r s o s
\ ( r r O
I O : u r > ' = o ; ^ u . ; ; . > $ . v
U o ^ ' r s u 1 ; ; @ ! \ q ? s * s u ;
; I O u * + q U . . / ; ( * \ ( s . ; <
. . r : ' ' u q . . . . q u \ . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
온라인으로 사용해보십시오!
여기 사용해보십시오
설명
코드는 두 단계로 구성된 8 단계로 구성됩니다. 코드를 부분적으로 살펴 보겠습니다.
1 단계 (A ^ B)
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
I O : u . . . . . . . . . . . . . . . .
U o ^ ' . . . . . . . . . . . . . . . .
; I O u . . . . . . / ; ( * \ . . . . .
? ? r : . . . . . . ? . . . \ ? ? ? ? ?
. . . . ? . . . . . ? . . . . . . . . .
? ? ? ? ?
. . . . .
. . . . .
. . . . .
. . . . .
첫 번째 단계와 관련이없는 부분이있는 큐브입니다. 물음표는 경로를보다 명확하게하기 위해 IP가 방문 할 no-ops를 표시합니다.
IO:'^o;IO:r*(; # Explanation
I # Push the first input (A)
O # output that
: # duplicate it
'^ # Push the character "^"
o # output that
; # pop it from the stack
I # Push the second input (B)
O # output that
: # duplicate
r # rotate top 3 elements
* # Push the product of the top two elements
( # decrease it by one
; # pop it from the stack (making the last
# two operations useless, but doing it
# this way saves 10B)
이제 스택은 다음과 같습니다. A, B, A, B
2 단계 (인쇄 루프 준비)
인쇄 루프는 3 개의 인수 (스택 상위 3 요소) 소요 : P, Q및 R. P반복 횟수이고 Q구분 기호 (문자 코드)이며 R반복 할 숫자입니다. 운 좋게도 루프는 결과 문자열이 R아닌로 끝나는 요구 사항을 처리합니다 Q.
우리는 A*정확한 B시간 을 반복하기를 원 하므로 구분 기호는 *입니다. 스택은로 시작합니다 A, B, A, B. 다시 한 번, 관련없는 모든 지침을 제거했습니다. IP는 S포인팅 북쪽 에서 시작합니다 .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . r . . . . . . . . . . . . . . .
. . . . r . . . . . . . . . . . . . . .
. . . . * . . . . . . . . . . . . . . .
. . . . ' . . . . . . . . . . . . . . .
. . . . S . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
'*rr # Explanation
'* # Push * (Stack: A, B, A, B, *)
rr # Rotate top three elements twice
스택은 이제 A, B, B, *, A입니다.
3/6/8 단계 (인쇄 루프)
개념
E . . . . .
? r s o s u
\ ( r r O <
. . . . . S
IP는 루프를 통과하여 S북쪽을 가리키고 에서 루프를 종료하고 E북쪽을 다시 가리 킵니다. 이 설명에서는 스택이로 설정되어 [..., A, B, C]있습니다. 다음과 같은 명령이 실행됩니다. IP는 물음표 앞에 루프를 남길 수 없으므로 처음 네 개의 명령어는 항상 실행됩니다.
Orr(?rsos # Explanation
O # Output `C`
rr # Rotate top three elements twice (Stack: [..., B, C, A])
( # Decrease A by one (Stack: [..., B, C, A-1])
? # If top of stack (A) > 0:
r # Rotate top of stack (Stack: [..., A-1, B, C])
s # Swap top elements (Stack: [..., A-1, C, B])
o # Output top of stack (B) as character code
s # Swap top elements (Stack: [..., A-1, B, C]
#
# ... and repeat ...
이행
관련성이없는 부분이 제거 된 큐브입니다. IP가에서 시작하여 S동쪽을 가리 킵니다.
. . . . .
. . . . .
. . . . .
? r s o s
\ ( r r O
. . . . . S ' = o ; ^ u . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
보시다시피, IP는 루프에 들어가기 전에 네 가지 명령을 거칩니다. 문자 코드가 다시 제거되었으므로이 부분에 입력 한 것과 정확히 동일한 스택으로 루프에 도달합니다.
'=o; # Explanation
'= # Push =
o # Output
; # Pop from stack
루프 내부에서 위의 설명이 유지됩니다.
4 단계 (IP 차별화)
위의 루프를 여러 번 사용하고 IP 루프가 모두 같은 지점에있게되므로 여러 실행을 구분해야합니다. 먼저 구분 기호를 구분할 수 있습니다 (첫 번째 실행에는 *, 두 번째 실행에는 세 개가 +분리 자로 있음). 반복되는 수의 값을 확인하여 런 2와 3을 구별 할 수 있습니다. 이것이 하나이면 프로그램을 종료해야합니다.
첫 번째 비교
큐브에 다음과 같은 모습이 있습니다. IP는 S에서 시작하여 북쪽을 가리 킵니다. 스택에 포함되어 있습니다 [..., * or +, A or 1, 0]. 숫자 1은 IP가 첫 번째 루프 인 경우 북쪽을 가리키는 위치를 나타내고 숫자 2는 IP가 두 번째 (또는 세 번째) 루프 인 경우 동쪽을 가리키는 위치를 나타냅니다.
u ' . . .
s + . 1 .
; \ - ? 2
S . . . .
. . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
;s'+-? # Explanation
; # Delete top element (0)
s # Swap the top two elements (Stack: 1/A, */+)
'+ # Push the character code of +
- # Subtract the top two elements and push
# that to the stack (Stack: 1/A, */+, +, (*/+)-+)
? # Changes the direction based on the top
# item on the stack. If it's 0 (if (*/+) == +)
# the IP continues going right, otherwise, it
# turns and continues going north.
IP가 현재이면 1스택은 [A, *, +, -1]입니다. 그렇지 않으면 스택은 [A or 1, +, +, 0]입니다. 보시다시피, 두 번째 경우의 스택에는 여전히 알려지지 않은 것이 있으므로 다른 비교를 수행해야합니다.
두 번째 비교
IP가 5 단계를 거쳤으므로 스택은 다음과 같습니다 [A^(B-1) or nothing, A or 1, +, +, 0]. 첫 번째 요소가 nothing이면 두 번째 요소는 1이고 그 반대도 마찬가지입니다. 큐브는 다음과 같습니다. IP는 S에서 시작하여 동쪽을 가리 킵니다. 이것이 두 번째 루프 인 경우 IP는 E서쪽을 가리키는로 끝납니다 . 그렇지 않으면 프로그램이에 도달하여 @종료됩니다.
. . . . .
. . . . ;
. . . S W
. . . . .
. . . . .
. . . . . . . . . . . . . ; . . . . . .
. . . . . . . . . E @ ! \ q . . . . . .
. . . . . . . . . . . . ( * . . . . . .
. . . . . . . . . . . . q u . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
제어 흐름에 아무런 영향을 미치지 않는 실행 된 명령어는 다음과 같습니다.
;;q*q(!@
;; # Delete top two elements (Stack [A^(B-1)/null, A/1, +])
q # Send top element to the bottom (Stack [+, A^(B-1)/0, A/1])
* # Push product of top two elements
# (Stack [+, A^(B-1)/0, A/1, A^B/0])
q # Send top element to the bottom
# (Stack [A^B/0, +, A^(B-1)/0, A/1])
( # Decrease the top element by 1
# (Stack [A^B/0, +, A^(B-1)/0, (A-1)/0])
! # If (top element == 0):
@ # Stop program
[A^B, +, A^(B-1), A-1]프로그램이 종료되지 않은 경우 스택은 이제 입니다.
5 단계 ( "A +"준비 (반복 A ^ (B-1)))
안타깝게도 Cubix에는 전력 연산자가 없으므로 다른 루프가 필요합니다. 그러나 먼저 스택을 정리해야합니다 [B, A, *, +, -1].
청소
다시 큐브가 있습니다. 평소와 같이 IP는 S (북쪽)에서 시작하고 E에서 서쪽을 가리키고 끝납니다.
. . . ? .
. . . ; .
. . . S .
. . . . .
. . . . .
. . . . . . . . . . . . . . . . > $ . v
. . . . . . . . . . . . . . . . . . . ;
. . . . . . . . . . . . . . . . . . E <
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
;; # Explanation
;; # Remove top 2 elements (Stack: [B, A, *])
A ^ (B-1) 계산
또 다른 루프는 인쇄 루프와 거의 동일하지만 조금 더 콤팩트합니다. IP는에서 시작 S하여 stack을 (를) 서쪽으로 가리 킵니다 [B, A, *]. E북쪽 을 가리키면 IP가 종료됩니다 .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . . . . . . . . . . . E . . . . .
. . . . . . . . . . . . . . ? s * s u .
. . . . . . . . . . . . . . \ ( s . ; S
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
루프 바디는 다음과 같습니다.
;s(?s*s # Explanation
; # Pop top element.
s # Shift top elements.
( # Decrease top element by one
? # If not 0:
s # Shift top elements again
* # Multiply
s # Shift back
#
# ... and repeat ...
결과 스택은 [A, A^(B-1), 0]입니다.
스택 청소 (다시)
이제 스택의 상단이 포함 된 인쇄 루프로 다시 이동해야합니다 [..., A^(B-1), +, A]. 이를 위해 다음을 실행합니다. 다시 큐브가 있습니다.
. . ^ ? :
. . . . .
. . . . .
. . . . .
E . . . .
. . . . . s . . . . . . . . ; . . $ . .
. . . . . + q U . . . . . . S . . s . .
. . . . . ' u q . . . . . . . . . ? . .
. . . . . . . ? . . . . . . . . . ? . .
. . . . . . . ? . . . . . . . . . ? . .
. . ? . .
. . ? . .
. . ? . .
. . ? . .
. . ? . .
;:$sqq'+s # Explanation
; # Delete top element (Stack: [A, A^(B-1)])
: # Copy top element
$s # No-op
qq # Send top two elements to the bottom
# (Stack: [A^(B-1), A^(B-1), A])
'+ # Push +
# (Stack: [A^(B-1), A^(B-1), A, +])
s # Swap top two elements
# (Stack: [A^(B-1), A^(B-1), +, A])
7 단계 (마지막 루프 준비)
스택은 이제 [A^B, +, A^(B-1), A-1]이고 IP는에서 시작하여 S서쪽으로 E가고 에서 끝납니다 .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . . E . . . . . . . . . . . . . .
. . . . . . u 1 ; ; S . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
실행 된 명령 :
;;1 # Explanation
;; # Delete top two elements
1 # Push 1
이제 스택이처럼 보이고 [A^B, +, 1]IP가 인쇄 루프에 들어 가려고합니다.