Recientemente publiqué una pregunta sobre los juegos de Diffy que no ha recibido respuesta. Está bien, la pregunta es realmente difícil, pero me gustaría hacer una pregunta más fácil sobre los juegos de Diffy para que podamos poner la pelota en marcha.
¿Cómo funciona Diffy?
Copiado de Find Diffy Games
El juego Diffy funciona de la siguiente manera: comienzas con una lista de enteros no negativos, en este ejemplo usaremos
3 4 5 8
Luego tomas la diferencia absoluta entre números adyacentes
(8) 3 4 5 8
5 1 1 3
Entonces repites. Repite hasta que se da cuenta de que ha entrado en un bucle. Y luego, en general, el juego comienza desde el principio nuevamente.
3 4 5 8
5 1 1 3
2 4 0 2
0 2 4 2
2 2 2 2
0 0 0 0
0 0 0 0
La mayoría de los juegos terminan en una cadena de todos los ceros, lo que se considera un estado perdido, pero algunos juegos raros se atascan en bucles más grandes.
Tarea
Dado el estado inicial de un juego Diffy, determine si el juego finalmente alcanza o no un estado de todos ceros. Debe generar un valor de Verdad o Falsía para cada uno de los dos estados. Lo que corresponde a lo que no importa.
El objetivo es minimizar el número de bytes en su fuente.
fuente
1 1 0
es periódico, también lo42 42 41
es ese estado.n
es impar, el juego no llega a cero a menos que todos los números sean iguales. Si la longitud es una potencia de 2, siempre va a cero.n
elementos y máximom
toma en la mayoría de losn * bit_length(m)
pasos. Entonces,n*m
también es un límite superior. Un límite superior más fuerte est(n) * bit_length(m)
, dondet(n)
es la mayor potencia de 2 que es un factor den
.Respuestas:
Pyth, 6 bytes
Banco de pruebas
Este programa es muy suave. 0 (falso) significa todos los ceros, cualquier otra cosa (verdad) significa no todos los ceros.
Cómo funciona:
fuente
Mathematica, 52 bytes
Función pura que toma una lista de enteros no negativos como entrada y retorno
True
oFalse
.Abs[#-RotateLeft@#]&
es una función que ejecuta una ronda del juego de diferencia. (Técnicamente debería serloRotateRight
, pero la respuesta final no se ve afectada, y bueno, byte libre). Entonces seNest[...,#,R]
ejecutaR
rondas del juego de diferencia y luego1>Max@
detecta si el resultado es todo ceros.¿Cómo sabemos cuántas rondas de juego de diferencia
R
hacer? Sim
es el valor más grande en la entrada, observe que nunca produciremos un número entero mayor quem
no importa cuántas rondas hagamos. El número total de listas de longitudl
de enteros no negativos todos delimitados porm
es(m+1)^l
. Entonces, si llevamos a cabo(m+1)^l
rondas del juego de diferencia, estamos garantizados de haber visto alguna lista dos veces para entonces, y así estaremos en la parte periódica del juego. En particular, el juego termina en todos los ceros si y solo si el resultado de las(m+1)^l
rondas del juego es la lista de todos los ceros. Esa expresión es lo queMax[1+#]^Tr[1^#]
calcula.fuente
Jalea , 13 bytes
Emite 0 (falsey) si se alcanzará el estado cero, de lo contrario se devuelve un valor verdadero (un entero positivo).
Pruébalo en línea!
Utiliza la primera observación hecha por Greg Martin de que los números dentro de la matriz nunca pueden abandonar el dominio [0, m] donde m es el elemento máximo en la entrada, por lo que realizar (m + 1) l redondea donde l es la longitud de la entrada satisfacer.
¿Cómo?
fuente
PHP, 144 bytes
imprima 0 para todo cero y cualquier valor entero positivo para verdadero
Versión en línea
Expandido
fuente
array_push
? Pero por qué ?$_GET
como entrada, debe suponer que contiene una cadena.?0[0]=1&0[1]=1&0[2]=0
o?0[]=1&0[]=1&0[]=0
es una matriz de cadenas, pero esto no importa. Pero tiene razón, podría?0=1&1=1&2=0
acortarlo con por qué no àrray_push` Estoy seguro de que usted o Titus encuentran mejores formas de acortar esto.array_push($e,$e[$c=0]);
es exactamente igual$e[]=$e[$c=0];
e incluso ya usa la sintaxis ($r[]=$n
). Ya utilizamax
ahora lo que también debe reemplazarend($r)
con$n
porque$n
es siempre igual aend($r)
cuando el eco se ejecuta.R (3.3.1), 87 bytes
Devuelve cero para un juego que termina en todos ceros, y un número positivo de lo contrario.
aprovecha el mismo hecho de Greg Martin y usa el diff incorporado para hacer la diferencia
fuente
Röda , 80 bytes
Pruébalo en línea!
Sin golf:
fuente
05AB1E , 13 bytes
Devuelve 1 si termina en ceros y 0 en caso contrario.
Pruébalo en línea!
Explicación
Utiliza el límite superior de rondas:
max(input)*len(input)
explicado por xnor en la sección de comentarios.fuente
J, 22 bytes
Devuelve
0
(que está efectivamentefalse
en J) para un juego degenerado que termina en todos ceros. Devuelve1
(true
) si la enésima iteración contiene un número distinto de cero, donde n es igual al número entero más grande en la secuencia original multiplicado por la longitud de la lista. Vea la respuesta de Greg Martin explicando por qué esto es cierto.Traducción:
*
>./
^:( )
#
multiplicada por*
el mayor valor en la lista>./
:|&
de(- )
y1&|.
Ejemplos:
fuente
JavaScript (ES6),
95 9290 bytesExplicación
La función recursiva que se llama a sí misma siempre que el contador (que comienza en el valor máximo en la lista más uno a la potencia de la longitud de la lista [
= (max + 1)**length
]) no sea cero. En cada llamada, el contador disminuye, y cuando llega a cero, todos los elementos de la lista se comparan con cero. Si todos son iguales a cero, el programa vuelvetrue
, y de lofalse
contrario.fuente
PHP,
123115tomar entrada a través de HTTP get, por ejemplo,
?3&4&5&8
guarda algunos bytes.Imprime 1 si alcanza todos los ceros o nada de lo contrario.
toma la lista de argumentos a través de la línea de comando. Tengo la sensación de que esto se puede jugar aún más (mirando a @Titus).
fuente
Python 3.6, 101 bytes
Toma una tupla de números y devuelve False si termina en ceros y True si se repite.
fuente
JavaScript (ES6),
8483 bytesDevuelve
true
para un juego que termina en todos ceros, de lofalse
contrario.Prueba
Mostrar fragmento de código
fuente