Sabe-se que determinar se uma máquina de Turing pára é indecidível, mas isso não é necessariamente verdade para máquinas mais simples.
Uma máquina Foo é uma máquina com fita finita, em que cada célula da fita possui um número inteiro ou o símbolo de parada h
, por exemplo
2 h 1 -1
O ponteiro de instruções começa apontando para a primeira célula:
2 h 1 -1
^
A cada passo, o ponteiro da instrução avança pelo número para o qual aponta e depois nega esse número. Então, após uma etapa, ele avançaria 2
células e transformaria 2
em -2
:
-2 h 1 -1
^
A máquina Foo continua fazendo isso até o ponteiro da instrução apontar para o símbolo de parada ( h
). Então, aqui está a execução completa deste programa:
2 h 1 -1
^
-2 h 1 -1
^
-2 h -1 -1
^
-2 h -1 1
^
-2 h 1 1
^
A fita também é circular; portanto, se o ponteiro de instruções se mover de um lado da fita, ele será direcionado para o outro lado, por exemplo:
3 h 1 3
^
-3 h 1 3
^
-3 h 1 -3
^
-3 h -1 -3
^
-3 h -1 3
^
3 h -1 3
^
Uma coisa interessante sobre essas máquinas Foo é que algumas não param, por exemplo:
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á em loop nesses últimos quatro estados para sempre.
Então, escreva um programa que determine se uma máquina Foo pára ou não! Você pode usar qualquer formato de entrada (razoável) que desejar para as máquinas Foo e optar por usá-lo 0
como símbolo de parada. Você pode usar duas saídas distintas para o caso em que ele pára e o caso em que não. É claro que seu programa deve fornecer uma resposta em um período finito de tempo para todas as entradas válidas.
Isso é código-golfe , então tente tornar o seu programa o mais curto possível!
Casos de teste
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
(não para)
3 2 1 1 4 h
. Este interrompe, mas requer mais iterações que o dobro do 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 é interrompido após 786430 etapas.