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
fuente
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.Respuestas:
C # (compilador interactivo de Visual C #) , 71 bytes
Pruébalo en línea!
No sé si lo siguiente es válido, ya que requiere un delegado personalizado con una firma de
unsafe delegate System.Action<int> D(int* a);
y tiene que estar envuelto en ununsafe
bloque para ser utilizado, pero aquí está de todos modos:C # (.NET Core) , 64 bytes
Pruébalo en línea!
Esta función toma un int * y devuelve una acción; en otras palabras, es una función al curry. La única razón por la que uso punteros es por codegolf.meta.stackexchange.com/a/13262/84206, que me permite guardar bytes al tener una variable ya definida con la longitud de la matriz.
Guardado 9 bytes gracias a @someone
fuente
1<<f
con2*f
guardar un byte.Python 3 ,
6389 bytesPruébalo en línea!
También funciona para Python 2; Se puede guardar un byte en Python 2 reemplazando return con print y haciendo que la función print stdout en lugar de regresar. R gira
True
para detenerse yFalse
para no detenerse.Gracias a @Neil y @Arnauld por señalar que necesitaba comprobar más tiempo para detenerme. Gracias a @Jitse por señalar un problema con
[2,0]
. Gracias a @mypetlion por señalar que el valor absoluto de la cinta podría exceder la longitud de la cinta.fuente
x+x
es suficiente?[ 3, 2, 1, 1, 4, 0 ]
, que se detiene en más de 12 iteraciones.len(x)*x
[8,7,6,5,7,4,0,3,6]
2**len(x)
Todavía no está un poco por debajo del máximo? Calculo el número de estados comon*(2**n)
(conn=len(x)-1
).Jalea ,
1511 bytesPruébalo en línea!
Un enlace monádico que toma la entrada como una lista de enteros usando 0 para significar detener. Devuelve 0 para las entradas de detención y 1 para las que no se detienen.
Evita el problema de la necesidad de calcular el número de iteraciones debido al uso del
ÐL
cual se repetirá hasta que no se vea ningún resultado nuevo.¡Gracias a @JonathanAllan por guardar un byte!
Explicación
fuente
N1¦ṙ⁸ḢƊÐLḢẸ
Python 3 , 91 bytes
Pruébalo en línea!
-40 bytes gracias a JoKing y Jitse
fuente
while
condición.Perl 6 ,
46 4336 bytesPruébalo en línea!
Representa detener por
0
y devuelve verdadero si la máquina se detiene. Esto repite los2**(length n)
tiempos lógicos , donde si el puntero termina en la celda detenida, permanece allí, de lo contrario estará en una celda no detenida.Esto funciona porque solo hayDe acuerdo, sí, hay estados más que eso, pero debido a las posibles transiciones limitadas entre punteros (y, por lo tanto, estados) habrá menos de 2 ** $ _ estados ... creo2**n
estados posibles (ignorando las celdas de detención) para la máquina Foo, ya que cada celda sin detención tiene solo dos estados.Explicación
fuente
05AB1E ,
1413 bytesPruébalo en línea!
Toma la entrada como una lista de enteros con 0 como la instrucción de detención. Devuelve 1 para detener y 0 para no detener.
¡Gracias a @KevinCruijssen por guardar 2 bytes!
fuente
ć
! Estaba esperando una explicación con la esperanza de jugar mi respuesta, pero me ganaste, jaja. ; p -1 byte haciendo el mismo golf que mi respuesta:g·F
to«v
( Pruébelo en línea )©®
lugar deDŠs
:«vć©(š®._}®_
( Pruébelo en línea. )«v
agoF
.Java 8,
787973 bytesPuerto directo de la respuesta C # .NET de @EmbodimentOfIgnorance , ¡así que asegúrate de votarlo!
Gracias a @Arnauld por encontrar dos errores (que también se aplica a algunas otras respuestas).
Da como resultado un
java.lang.ArithmeticException: / by zero
error cuando puede detenerse, o ningún error si no es así.Pruébalo en línea.
Explicación:
fuente
int*
(de codegolf.meta.stackexchange.com/a/13262/84206 )Haskell , 79 bytes
Pruébalo en línea!
Devoluciones
True
para máquinas de detención, y de loFalse
contrario. Entrada en forma de una lista, con la0
representación de un estado de detención.Asume una versión de GHC mayor que 8.4 (lanzada en febrero de 2018).
fuente
JavaScript (Node.js) ,
7167 bytesBásicamente lo mismo que la respuesta C # .NET de @EmbodimentOfIgnorance
Ahorro de 4 bytes gracias a @Arnaud
Pruébalo en línea!
JavaScript (Node.js) , 61 bytes
Esta versión se usa
undefined
como un símbolo de detención y arroja unTypeError: Cannot read property 'f' of undefined
cuando la máquina se detiene y termina silenciosamente cuando la máquina no se detiene.Pruébalo en línea!
fuente
Scala , 156 bytes
Sigue siendo goloso en mi opinión, pero estoy de acuerdo con esto por ahora. Devuelve
0
para no detenerFoo
y1
para detenerFoo
s. Toma la entradaa
como anArray[Int]
, por lo queh
se toma como0
.Es bastante largo de ejecutar (alrededor de 4 segundos para todos los casos de prueba) debido a las múltiples búsquedas de matriz completa que hice, más las
.deep
que crean copias ... Pero aún puede intentarlo en línea.fuente
Perl 5
-ap
, 88 bytesPruébalo en línea!
fuente
Adjunto , 40 bytes
Pruébalo en línea!
Explicación
Esto realiza una sola iteración de la máquina Foo; niega el primer miembro, luego gira la matriz por el primer elemento (original, no negado) de la matriz.
Periodic
aplicará esta función hasta que se acumule un resultado duplicado. Una máquina se detiene o entra en un bucle infinito trivial. Si se detiene, el primer elemento será 0. De lo contrario, será distinto de cero.&N
Es una forma de golf de obtener el primer elemento de una matriz numérica. Luego,Not
regresatrue
para 0 (máquinas de detención) yfalse
para cualquier otra cosa (máquinas sin detención).fuente
Carbón , 28 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Salidas que utilizan la salida booleana predeterminada de Charcoal, que es
-
para verdadero y nada para falso. Explicación:Inicialice el puntero de instrucciones.
Haga un bucle tantas veces como haya estados teóricamente posibles.
Negar el valor en el puntero de instrucción.
Resta el nuevo valor del puntero de instrucción. Los accesos a la matriz de carbón son cíclicos, por lo que esto emula automáticamente la cinta circular de Foo.
Al final del ciclo, indique si el programa se detuvo.
fuente
Stax , 11 bytes
Ejecutar y depurarlo
Toma entrada en forma de una matriz de enteros, con la
0
detención de la representación.Sale
1
para una0
máquina de detención y para una máquina sin detención.fuente
Pyth , 12 bytes
¡Banco de pruebas!
Utiliza el enfoque directo. Repetir hasta que veamos la lista dos veces en un estado idéntico. Para los programas que se detienen, la lista eventualmente tendrá un liderazgo
0
porque es donde se detiene la recursividad. Para los programas que no se detienen, la lista no comenzará con0
, sino que estará en un estado en el que el proceso sería periódico y, por lo tanto, la máquina Foo no se detendría.fuente