Es bien sabido que determinar si una máquina de Turing se detiene es indecidible, pero eso no es necesariamente cierto para máquinas más simples.
Una máquina Foo es una máquina con una cinta finita, donde cada celda de la cinta tiene un número entero o el símbolo de detención h
, p. Ej.
2 h 1 -1
El puntero de instrucciones comienza apuntando a la primera celda:
2 h 1 -1
^
En cada paso, el puntero de instrucciones avanza por el número al que apunta, y luego niega ese número. Entonces, después de un paso, movería las 2
celdas hacia adelante y las convertiría 2
en -2
:
-2 h 1 -1
^
La máquina Foo sigue haciendo esto hasta que el puntero de instrucción apunta al símbolo de detención ( h
). Entonces, aquí está la ejecución completa de este programa:
2 h 1 -1
^
-2 h 1 -1
^
-2 h -1 -1
^
-2 h -1 1
^
-2 h 1 1
^
La cinta también es circular, por lo que si el puntero de instrucciones se mueve de un lado de la cinta, va al otro lado, por ejemplo:
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 interesante acerca de estas máquinas Foo es que algunas no se detienen, por ejemplo:
1 2 h 2
^
-1 2 h 2
^
-1 -2 h 2
^
-1 -2 h -2
^
-1 2 h -2
^
-1 2 h 2
^
Este programa continuará girando en esos últimos cuatro estados para siempre.
Por lo tanto, escriba un programa que determine si una máquina Foo se detiene o no. Puede usar cualquier formato de entrada (razonable) que desee para las máquinas Foo, y puede elegir usar0
como símbolo de detención. Puede usar dos salidas distintas para el caso en que se detiene y el caso en que no. Su programa debe, por supuesto, generar una respuesta en un tiempo finito para todas las entradas válidas.
Esto es código golf , ¡así que trate de hacer su programa lo más corto posible!
Casos de prueba
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
(no se detiene)
3 2 1 1 4 h
. Éste se detiene pero requiere más iteraciones que el doble del número de elementos.
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
que se detiene después de 786430 pasos.