スパイラル、スコア: 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
、4行目の文字から始まります。実行する最初のコードは0;vg
です。;
入力として数値を受け取り、スタックに配置します。v
レジスターにあるもの(ゼロ)をスタックに入れます。カウンタとして使用されます。g
ラベルです。到達すると、コントロールg
はコード内の他の文字の出現箇所にジャンプします。
これがコントロールの場所です:
X
v
g
他のすべての方向に空白があるため、命令ポインターは上方向に移動し始めます。
v
スタックにゼロを置き、X
すぐにスタックからポップします。ポップされた値はゼロであるため、命令ポインタは移動しますX
(そうでない場合、空白として処理されます)。
デフォルトでは、制御フローは右折モードになっているため、ジャンクションに到達すると、命令ポインターが右折します。v
さらにゼロをスタックにプッシュし*
、レジスタを1増やします。
v*v*v
X
v
g
次にv
、レジスター(番号1)にあるものをスタックに配置し、命令ポインターが右に曲がって、nextをヒットしようとしますX
。スタックに追加されたばかりの値がポップされ、レジスタに配置されます。ゼロ以外であるため、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
、スタックから余分なゼロをポップ~
し、スタック内の残りの2つの値(値はカウンターと入力値)を比較します。値が同じ場合、演算子はスタックにゼロを配置します(それ以外の場合は-1または1)。再び、コントロールは右に曲がろうとします。X
スタックから比較の値をポップします(ゼロの場合)。入力されたX
後!
、プログラムを終了します。
P.X~ZZ*v+^
X
!
それ以外の場合、IPはに続きZ
ます。この場合、ラベルは1ステップだけ右にジャンプします。これを行う理由は、ジャンプするとレジスタの値がゼロに戻るからです。*
レジスタをインクリメントしv
、結果の1をスタックに配置します。+
スタックの2つの最上位要素(1とカウンター)をポップし、それらを追加して、結果をスタックに配置します(実際には、カウンターが1ずつ増加します)。^
結果をスタックから削除せずに、スタックからレジスタにコピーします。
#
レジスタ内の値を1ずつv
減分し、減分した値をスタックにプッシュし、IPが右に向きを変えようとX
し、スタックから値をポップします。値がゼロ以外の場合、IPは東に移動し続け、ゼロになるまでレジスタの値をデクリメントし、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
ブランチは、カウンターの値に対応するラベルにつながります。ラベルにヒットすると、コントロールは、labelで開始したセクション内のラベルの別のオカレンスにジャンプし、g
別の反復を開始します。と同様g
に、レジスタ内の値は、印刷する必要がある文字のASCII値まで増分されます。次に、文字が印刷され、カウンターがインクリメントされ、別のラベルが選択されます。これは、最後の反復の後、カウンターが入力と等しくなり、プログラムが終了するまで発生します。
編集:
P.X~Zv+^
X *
! Z
と同じことを達成します
P.X~ZZ*v+^
X
!
ただし、空白は少なくなります。
編集2:
vv****v+^v+^v+^v+^*v++P
次の代わりに使用できます。
*****************************************************************vP