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
fonte
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.Respostas:
C # (compilador interativo do Visual C #) , 71 bytes
Experimente online!
Não sei se o seguinte é válido, pois requer um delegado personalizado com uma assinatura
unsafe delegate System.Action<int> D(int* a);
e precisa ser agrupado em umunsafe
bloco para ser usado, mas aqui está:C # (.NET Core) , 64 bytes
Experimente online!
Essa função recebe um int * e retorna uma ação; em outras palavras, é uma função ao curry. A única razão pela qual eu uso ponteiros é por causa de codegolf.meta.stackexchange.com/a/13262/84206, que me permite salvar bytes já tendo uma variável já definida com o comprimento da matriz.
Guardado 9 bytes graças a @someone
fonte
1<<f
com2*f
a salvar um byte.Python 3 ,
6389 bytesExperimente online!
Também funciona para Python 2; um byte pode ser salvo no Python 2 substituindo return por print e tendo a função print em stdout em vez de retornar. R gira
True
para parar eFalse
para não parar.Agradeço a @Neil e @Arnauld por notar que eu precisava verificar por mais tempo para parar. Obrigado a @Jitse por apontar um problema com
[2,0]
. Agradecemos a @mypetlion por observar que o valor absoluto dos valores da fita pode exceder o comprimento da fita.fonte
x+x
é suficiente?[ 3, 2, 1, 1, 4, 0 ]
, que para em mais de 12 iterações.len(x)*x
[8,7,6,5,7,4,0,3,6]
2**len(x)
Ainda não está nem um pouco abaixo do máximo? Eu calculo o número de estados comon*(2**n)
(comn=len(x)-1
).Geléia ,
1511 bytesExperimente online!
Um link monádico que recebe a entrada como uma lista de números inteiros usando 0 para significar parada. Retorna 0 para interromper entradas e 1 para aqueles que não param.
Evita o problema de precisar trabalhar com o número de iterações, pois o uso
ÐL
será repetido até que nenhum novo resultado seja visto.Obrigado a @ JonathanAllan por salvar um byte!
Explicação
fonte
N1¦ṙ⁸ḢƊÐLḢẸ
Python 3 , 91 bytes
Experimente online!
-40 bytes graças ao JoKing e Jitse
fonte
while
condição.Perl 6 ,
46 4336 bytesExperimente online!
Representa a interrupção
0
e retorna true se a máquina parar . Isso repete os2**(length n)
tempos lógicos , nos quais, se o ponteiro terminar na célula de parada, ele permanecerá lá, caso contrário, ele estará em uma célula de não parada.Isso funciona porque existem apenasOk, sim, existem estados além disso, mas devido às limitadas transições possíveis entre ponteiros (e, portanto, estados), haverá menos de 2 ** $ _ estados ... eu acho2**n
estados possíveis (ignorando células de parada) para a máquina Foo estar, pois cada célula sem parada tem apenas dois estados.Explicação
fonte
05AB1E ,
1413 bytesExperimente online!
Leva a entrada como uma lista de números inteiros com 0 como a instrução de parada. Retorna 1 para parar e 0 para não parar.
Obrigado a @KevinCruijssen por salvar 2 bytes!
fonte
ć
! Eu estava esperando por uma explicação na esperança de responder a minha resposta, mas você me venceu, haha. ; p -1 byte fazendo o mesmo golfe que a minha resposta:g·F
a«v
( Experimente on-line. )©®
vez deDŠs
:«vć©(š®._}®_
( Experimente online. )«v
paragoF
.Java 8,
787973 bytesPorta direta da resposta C # .NET do @EmbodimentOfIgnorance , por isso, vote- o novamente !
Agradecemos a @Arnauld por encontrar dois bugs (o que também se aplica a outras respostas).
Resulta em um
java.lang.ArithmeticException: / by zero
erro quando é capaz de parar ou em nenhum erro, se não.Experimente online.
Explicação:
fonte
int*
(de codegolf.meta.stackexchange.com/a/13262/84206 )Haskell , 79 bytes
Experimente online!
Retorna
True
para máquinas de parada, eFalse
caso contrário. Entrada na forma de uma lista, com a0
representação de um estado de parada.Supõe uma versão do GHC maior que 8.4 (lançado em fevereiro de 2018).
fonte
JavaScript (Node.js) ,
7167 bytesBasicamente, o mesmo que @EmbodimentOfIgnorance C # .NET do
Economize 4 bytes graças a @Arnaud
Experimente online!
JavaScript (Node.js) , 61 bytes
Esta versão usa
undefined
como um símbolo de parada e lança umTypeError: Cannot read property 'f' of undefined
quando a máquina pára e termina silenciosamente quando a máquina não para.Experimente online!
fonte
Scala , 156 bytes
OMI ainda jogável, mas estou bem com isso por enquanto. Retorna
0
paraFoo
s sem interrupção e s1
com interrupçãoFoo
. Recebe a entradaa
comoArray[Int]
, eh
é tomada como0
.É muito longo para executar (cerca de 4 segundos para todos os casos de teste) por causa das várias pesquisas de matriz completa que fiz, além das
.deep
que criam cópias ... Mas você ainda pode experimentá-lo online.fonte
Perl 5
-ap
, 88 bytesExperimente online!
fonte
Anexo , 40 bytes
Experimente online!
Explicação
Isso executa uma única iteração da máquina Foo; nega o primeiro membro e depois gira a matriz pelo primeiro elemento (original, não negado) da matriz.
Periodic
aplicará esta função até que um resultado duplicado seja acumulado. Uma máquina pára ou entra em um loop infinito trivial. Se parar, o primeiro elemento será 0. Caso contrário, será diferente de zero.&N
é uma maneira de obter o primeiro elemento de uma matriz numérica. Em seguida,Not
retornatrue
para 0 (máquinas de parada) efalse
para qualquer outra coisa (máquinas sem parada).fonte
Carvão , 28 bytes
Experimente online! Link é a versão detalhada do código. Saídas usando a saída booleana padrão do Charcoal, que é
-
para true e nada para false. Explicação:Inicialize o ponteiro da instrução.
Faça o loop tantas vezes quanto houver estados teoricamente possíveis.
Negue o valor no ponteiro da instrução.
Subtraia o novo valor do ponteiro da instrução. Os acessos à matriz do carvão vegetal são cíclicos, portanto emula automaticamente a fita circular do Foo.
No final do loop, mostre se o programa foi interrompido.
fonte
Stax , 11 bytes
Execute e depure
Ele recebe entrada na forma de uma matriz inteira, com
0
representação de parada.Ele produz
1
para uma parada e0
para uma máquina sem parada.fonte
Pitão , 12 bytes
Suíte de teste!
Usa a abordagem direta. Faça o recursão até vermos a lista duas vezes em um estado idêntico. Para programas interrompidos, a lista acabará tendo uma liderança,
0
porque é aí que a recursão para. Para programas que não são interrompidos, a lista não começa com o0
, mas sim em um estado no qual o processo seria periódico e, portanto, a máquina Foo não seria interrompida.fonte