スパイラル、スコア: 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