Determinare se una macchina di Turing si ferma è noto per essere indecidibile, ma ciò non è necessariamente vero per le macchine più semplici.
Una macchina Foo è una macchina con un nastro finito, in cui ogni cella sul nastro ha un numero intero o il simbolo di arresto h
, ad es.
2 h 1 -1
Il puntatore dell'istruzione inizia puntando alla prima cella:
2 h 1 -1
^
Ad ogni passo, il puntatore dell'istruzione si sposta in avanti del numero a cui punta, quindi annulla quel numero. Quindi, dopo un passaggio, si sposterebbe in avanti le 2
celle e trasformerebbe 2
in un -2
:
-2 h 1 -1
^
La macchina Foo continua a farlo finché il puntatore dell'istruzione non punta al simbolo di arresto ( h
). Quindi, ecco la piena esecuzione di questo programma:
2 h 1 -1
^
-2 h 1 -1
^
-2 h -1 -1
^
-2 h -1 1
^
-2 h 1 1
^
Anche il nastro è circolare, quindi se il puntatore dell'istruzione si sposta da un lato del nastro, va dall'altro lato, ad esempio:
3 h 1 3
^
-3 h 1 3
^
-3 h 1 -3
^
-3 h -1 -3
^
-3 h -1 3
^
3 h -1 3
^
Una cosa interessante di queste macchine Foo è che alcune non si fermano, ad esempio:
1 2 h 2
^
-1 2 h 2
^
-1 -2 h 2
^
-1 -2 h -2
^
-1 2 h -2
^
-1 2 h 2
^
Questo programma continuerà in loop negli ultimi quattro stati per sempre.
Quindi, scrivi un programma che determina se una macchina Foo si ferma o no! Puoi usare qualsiasi formato di input (ragionevole) che ti piace per le macchine Foo e puoi scegliere di usare 0
come simbolo di arresto. È possibile utilizzare due uscite distinte per il caso in cui si ferma e per il caso in cui non si ferma. Ovviamente il tuo programma deve fornire una risposta in un tempo limitato per tutti gli input validi.
Questo è code-golf , quindi cerca di rendere il tuo programma il più breve possibile!
Casi test
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
(non si ferma)
3 2 1 1 4 h
. Questo si ferma ma richiede più iterazioni rispetto al doppio del numero di elementi.
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
:, che si arresta dopo 786430 passi.