チューリングマシンが停止するかどうかを判断することは、決定できないことがよく知られていますが、それは単純なマシンでは必ずしも当てはまりません。
Fooのマシンは、テープ上の各セルは整数または停止シンボルがある有限のテープ、と機械でh
、例えば
2 h 1 -1
命令ポインターは、最初のセルを指すことから始まります。
2 h 1 -1
^
すべてのステップで、命令ポインターはそれが指す数値だけ前方に移動し、その数値を無効にします。したがって、1つのステップの後、2
セルを前方に移動2
し、aに変換し-2
ます。
-2 h 1 -1
^
Fooマシンは、命令ポインターが停止記号(h
)を指すまでこれを続けます。したがって、このプログラムの完全な実行は次のとおりです。
2 h 1 -1
^
-2 h 1 -1
^
-2 h -1 -1
^
-2 h -1 1
^
-2 h 1 1
^
テープも円形であるため、命令ポインターがテープの片側から外れると、反対側に移動します。例:
3 h 1 3
^
-3 h 1 3
^
-3 h 1 -3
^
-3 h -1 -3
^
-3 h -1 3
^
3 h -1 3
^
これらのFooマシンの興味深い点の1つは、停止しないものがあることです。たとえば:
1 2 h 2
^
-1 2 h 2
^
-1 -2 h 2
^
-1 -2 h -2
^
-1 2 h -2
^
-1 2 h 2
^
このプログラムは、最後の4つの状態で永遠にループを続けます。
したがって、Fooマシンが停止するかどうかを判断するプログラムを作成してください。Fooマシンには任意の(合理的な)入力形式を使用でき0
、停止記号として使用することもできます。停止する場合と停止しない場合の2つの異なる出力を使用できます。もちろん、プログラムは、すべての有効な入力に対して有限時間で回答を出力する必要があります。
これはcode-golfなので、プログラムをできるだけ短くしてください。
テストケース
2 h 1 -1
Halts
3 h 1 3
Halts
h
Halts
1 1 1 1 h
Halts
2 1 3 2 1 2 h
Halts
3 2 1 1 4 h
Halts
1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 h -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36
Halts
2 h
Does not halt
1 2 h 2
Does not halt
8 1 2 3 3 4 8 4 3 2 h
Does not halt
1 2 4 3 h 2 4 5 3
Does not halt
3 1 h 3 1 1
Does not halt
1 2 h 42
Does not halt
1 2 h 42
停止しない)
3 2 1 1 4 h
。これは停止しますが、要素数の2倍以上の反復が必要です。
1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 h -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36
、786430ステップ後に停止します。