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 \ . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
オンラインでお試しください!
ここで試してみてください
説明
コードは2つのループを持つ8つのステップで構成されます。コードを部分ごとに説明します。
ステップ1(A ^ B)
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
I O : u . . . . . . . . . . . . . . . .
U o ^ ' . . . . . . . . . . . . . . . .
; I O u . . . . . . / ; ( * \ . . . . .
? ? r : . . . . . . ? . . . \ ? ? ? ? ?
. . . . ? . . . . . ? . . . . . . . . .
? ? ? ? ?
. . . . .
. . . . .
. . . . .
. . . . .
これは、最初のステップに関係のない部分が削除されたキューブです。疑問符は、そのパスをより明確にするために、IPがアクセスするno-opを示しています。
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は疑問符の前にループを離れることができないため、最初の4つの命令は常に実行されることに注意してください。
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はループに入る前に4つの命令に遭遇します。文字コードが再び削除されるため、この部分に入ったときとまったく同じスタックでループに到達します。
'=o; # Explanation
'= # Push =
o # Output
; # Pop from stack
ループ内では、上記の説明が当てはまります。
ステップ4(IPの区別)
上記のループを複数回使用し、それらすべてがIPを同じスポットで終了させるため、複数の実行を区別する必要があります。最初に、セパレーターを区別できます(最初の実行にはがあり*
、2 番目と3 番目の実行には+
セパレーターがあります)。繰り返される数値の値を確認することで、実行2と実行3を区別できます。それが1つの場合、プログラムは終了するはずです。
最初の比較
キューブ上では次のようになります。IPはSから始まり、北を指します。スタックにはが含まれます[..., * or +, A or 1, 0]
。番号1は、これが最初のループ(北を指す)の場合にIPが終わる場所を示し、番号2は、これが2番目(または3番目)のループ(東を指す)の場合に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]
です。ご覧のとおり、2番目のケースのスタックにはまだ不明なものがあるため、別の比較を行う必要があります。
2回目の比較
IPは手順5を経ているため、スタックは次のようになります[A^(B-1) or nothing, A or 1, +, +, 0]
。最初の要素がのnothing
場合、2番目の要素は1
であり、逆も同様です。キューブは次のようになります。IPはSから始まり、東を指します。これが2番目のループである場合、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, *]
。IPはE
北を指すようになります。
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . . . . . . . . . . . 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が印刷ループに入ろうとしているので、完了です。