Il est notoire que déterminer si une machine de Turing s'arrête est indécidable, mais ce n'est pas nécessairement le cas pour les machines plus simples.
Une machine Foo est une machine avec une bande finie, où chaque cellule de la bande a un entier ou le symbole d’arrêt h
, par exemple:
2 h 1 -1
Le pointeur d'instruction commence par pointer vers la première cellule:
2 h 1 -1
^
A chaque étape, le pointeur d'instruction avance du nombre indiqué, puis annule ce nombre. Ainsi, après une étape, les 2
cellules avancent et se transforment 2
en -2
:
-2 h 1 -1
^
La machine Foo continue ainsi jusqu'à ce que le pointeur d'instruction pointe vers le symbole d'arrêt ( h
). Alors, voici la pleine exécution de ce programme:
2 h 1 -1
^
-2 h 1 -1
^
-2 h -1 -1
^
-2 h -1 1
^
-2 h 1 1
^
La bande est également circulaire. Par conséquent, si le pointeur d’instruction se déplace d’un côté à l’autre de la bande, il passe de l’autre côté, par exemple:
3 h 1 3
^
-3 h 1 3
^
-3 h 1 -3
^
-3 h -1 -3
^
-3 h -1 3
^
3 h -1 3
^
Une chose intéressante à propos de ces machines Foo est que certaines ne s’arrêtent pas, par exemple:
1 2 h 2
^
-1 2 h 2
^
-1 -2 h 2
^
-1 -2 h -2
^
-1 2 h -2
^
-1 2 h 2
^
Ce programme continuera à boucler dans ces quatre derniers états pour toujours.
Alors, écrivez un programme qui détermine si une machine Foo s'arrête ou non! Vous pouvez utiliser n’importe quel format d’entrée (raisonnable) que vous aimez pour les machines Foo, et vous pouvez choisir d’utiliser0
comme symbole d’arrêt. Vous pouvez utiliser deux sorties distinctes pour le cas où cela s’arrête et le cas où ce n’est pas le cas. Votre programme doit bien sûr générer une réponse dans un délai déterminé pour toutes les entrées valides.
C'est du code-golf , alors essayez de rendre votre programme aussi court que possible!
Cas de 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
(ne s’arrête pas)
3 2 1 1 4 h
. Celui-ci s'arrête mais nécessite plus d'itérations que le double du nombre d'éléments.
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
:, qui s'arrête après 786430 étapes.