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 2celdas hacia adelante y las convertiría 2en -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 -36que 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 ununsafebloque 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<<fcon2*fguardar 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
Truepara detenerse yFalsepara 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+xes 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
ÐLcual 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
whilecondición.Perl 6 ,
46 4336 bytesPruébalo en línea!
Representa detener por
0y 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**nestados 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·Fto«v( Pruébelo en línea )©®lugar deDŠs:«vć©(š®._}®_( Pruébelo en línea. )«vagoF.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 zeroerror 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
Truepara máquinas de detención, y de loFalsecontrario. Entrada en forma de una lista, con la0representació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
undefinedcomo un símbolo de detención y arroja unTypeError: Cannot read property 'f' of undefinedcuando 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
0para no detenerFooy1para detenerFoos. Toma la entradaacomo anArray[Int], por lo quehse 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
.deepque 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.
Periodicaplicará 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.&NEs una forma de golf de obtener el primer elemento de una matriz numérica. Luego,Notregresatruepara 0 (máquinas de detención) yfalsepara 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
0detención de la representación.Sale
1para una0má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
0porque 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