この課題は、のための賞であるais523のための勝利「新人王」のカテゴリを「PPCG 2016のベスト」。おめでとう!
BackFlipは、ユーザーais523によって作成された難解なプログラミング言語です。ais523は、他にも30以上の興味深いesolangを作成しています。
BackFlipはBefungeや> <>のような2D言語で、命令ポインターがテキストのグリッド(プログラム)を横断し、上、下、左、右に移動し、文字に応じて方向を変えます。重大なことに、BackFlipプログラムのグリッドは、ラングトンのAntのように、移動中に変化します。
この課題では、BackFlipプログラムは常にテキストの長方形のグリッド(すべての行が同じ長さ)で、サイズが少なくとも1×1で、文字のみを含むと想定できます./\<>^V
。(.
スペースではなく、可視性のために使用されます。)ここで使用するBackFlipは、意味的には元のspecと同じです。
BackFlipの命令ポインター(IP)は、常にプログラムの左上隅のすぐ右から始まります。遭遇する可能性のあるコマンドには3つのタイプがあります。
.
ノーオペレーションです。IPは、進行方向に進みます。ノーオペレーションはノーオペレーションのままです。/
と\
ミラーです。それらは、角度で示される方向にIPを反射し、その後、他のタイプのミラーに変わります。- たとえば、IPが左に向かう場合、
\
左ではなく上方向に動き始め、はに\
なります/
。
- たとえば、IPが左に向かう場合、
<
、>
、^
、およびV
矢印です。IPを指し示す方向にリダイレクトし、IPが来た方向(IPが動いていた方向とは反対)を指す矢印に変わります。- たとえば、IPが下に向かう場合、IPは下
>
ではなく右に移動し始めます。これは、IPの方向で>
ある^
ためです。
- たとえば、IPが下に向かう場合、IPは下
BackFlipプログラムは、IPが範囲外に移動すると、つまりグリッドから外れると終了します。それは結局のところ、すべての無限ループが不可能であるため、バク転プログラムが最終的に終了します。(これは真実であると仮定できます。)
この課題の目標は、BackFlipプログラムを取り込んで、プログラムが終了する前に命令ポインターが取る移動数を出力するプログラムまたは関数を作成することです。つまり、プログラムの実行中にIPは何ステップを実行しますか?これには、グリッドへの最初のステップとグリッドからの最終ステップが含まれます。
たとえば、指示ポインターは、単純なグリッドで5つのステップを取ります....
。
.... <- empty 4×1 grid
012345 <- step number of the IP
したがって、への出力....
は5
です。
より複雑な4×2グリッド
\...
\.><
IPは9番目のステップでグリッドを終了するため、出力は9
次のようになります。
step grid IP position (@)
0 \... @....
\.>< ....
1 \... @...
\.>< ....
2 /... ....
\.>< @...
3 /... ....
/.>< .@..
4 /... ....
/.>< ..@.
5 /... ....
/.<< ...@
6 /... ....
/.<< ..@.
7 /... ....
/.>< .@..
8 /... ....
/.>< @...
9 /... ....
\.>< ....
@
バイト単位の最短コードが優先されます。
必要に応じて、複数行の文字列ではなく、行の配列または文字の行列として入力を取得できますが、文字./\<>^V
(整数オペコードではなく)を使用する必要があります。.
必要に応じてスペースを使用できます。\
入力のような文字をエスケープする必要がある場合は問題ありません。出力は常に複数の整数です。
テストケース
....
5
\...
\.><
9
.
2
..
3
.
.
2
\
2
^
2
.^.
3
<.
2
\\
\/
7
>V
^<
6
>\
>/
6
\><
2
\><
\><
7
\><
\><
\><
12
\.V.
\.\<
5
\.V.
\./<
9
V./\
V./\
>./<
..\/
14
\V..
.^..
\/><
.V..
.^..
20
\.V.V.
\./.\<
.>\<..
..^.^.
31
\.V.V.V.
\./>/.\<
.>\>\<..
..^.^.^.
69
\.V.V.V.V.
\./>/>/.\<
.>\>\>\<..
..^.^.^.^.
145
\.V.V.V.V.V.V.V.V.V.V.
\./>/>/>/>/>/>/>/>/.\<
.>\>\>\>\>\>\>\>\>\<..
..^.^.^.^.^.^.^.^.^.^.
9721
/
IPを上げ、ヘッディングで/
IPを右に動かします。まるで壁から跳ね返るボールのようです。(ただし/
、IPに触れた後のバックスラッシュへの変更を思い出してください。)