Imagine un "cable" que tiene n
espacios. Imagine además que hay "electrones" en ese cable. Estos electrones solo viven por una unidad de tiempo. Cualquier espacio en el cable adyacente a exactamente un electrón se convierte en un electrón. En la terminología de Game of Life, esto es B1/S
.
Por ejemplo, este es un cable de longitud 10, con período 62.
Reglas
- La entrada,
n
es un entero positivo único. - La salida debe ser un entero entero que denote el período de un cable de longitud n.
- El estado inicial es un solo electrón en un extremo del cable.
- El período no incluye necesariamente el estado inicial. Algunas longitudes nunca vuelven al estado inicial, pero todas son periódicas.
- Un cable estático (es decir, uno sin electrones) tiene período 1.
- Las condiciones de contorno no son periódicas. Es decir, el cable no es toroidal de ninguna manera.
Casos de prueba
Un agradecimiento especial a orlp por producir esta lista. (Lo he verificado hasta n = 27.)
1 1
2 2
3 1
4 6
5 4
6 14
7 1
8 14
9 12
10 62
11 8
12 126
13 28
14 30
15 1
16 30
17 28
18 1022
19 24
20 126
21 124
22 4094
23 16
24 2046
25 252
26 1022
27 56
28 32766
29 60
30 62
31 1
32 62
33 60
34 8190
35 56
36 174762
37 2044
38 8190
39 48
40 2046
41 252
42 254
43 248
44 8190
45 8188
Puede ver casos de prueba para n = 2 a 21 aquí con mi simulador de Game-of-Life-esque: Variations of Life .
EDITAR: ¡ la secuencia aquí ha sido publicada como A268754 !
code-golf
cellular-automata
El'endia Starman
fuente
fuente
2^n-1
el número superior , porque ese es el número de posibles estados distintos de cero del "cable"The period does not necessarily include the starting state. Some lengths never return to the starting state, but all of them are periodic.
¿Tienes un ejemplo?Respuestas:
Python 2,
14814287 bytesUtiliza el algoritmo de detección de ciclo de Brent y, por lo tanto, en realidad funciona rápido.
También he escrito una animación en Python (ambos funcionan en 2 y 3). Necesita
pyglet
correr. Puede ver la animación ejecutando:(Siéntase libre de descargar la esencia e inspeccionar el código antes de ejecutarlo). Puede presionar las teclas + y - para aumentar / disminuir la n que se visualiza.
Y finalmente, para aquellos interesados en explorar más esta secuencia numérica, aquí hay una versión legible (esto se usó para generar los casos de prueba anteriores):
fuente
Mathematica, 127 bytes
Explicación
Regla 18 :
Casos de prueba
fuente
Python 2, 68 bytes
La detección del ciclo podría ser mejor, pero el paso iterativo es bueno.
Al representar la matriz como un número binario
k
, la actualización se puede realizar tomando el XOR dek
uno desplazado hacia la izquierda/2
y otro hacia la derecha*2
, y luego truncando an
bytes como%2**n
.fuente
Python
32,134121118 bytesBásicamente lo mismo que mi respuesta de Pyth , pero lo adapté un poco debido a la falta de ciertas funciones integradas en Python.
Versión sin golf:
fuente
Pyth,
3936 bytesUtiliza la función de "punto fijo acumulativo" para iterar hasta justo antes de que se repita una configuración, y devuelve todas las configuraciones intermedias como una lista de listas. Esto funciona porque las reglas son deterministas y la configuración de la próxima generación es una función de la configuración actual. Esto significa que una vez que la misma configuración aparece nuevamente, los autómatas han completado un ciclo.
Después de llegar a eso (la última iteración del ciclo), llama a la función next-gen por última vez en el último elemento de la lista "history", para obtener la siguiente configuración (que es la configuración inicial de un ciclo), y encuentra su índice en la historia. Ahora el período es simplemente la duración (1 + índice de finalización del ciclo) menos el índice de inicio del ciclo.
En pseudocódigo pitónico:
El conjunto de pruebas lleva demasiado tiempo para que el servidor lo elimine, por lo que deberá usar el programa normal y probarlo uno por uno, o instalar Pyth (si no lo ha hecho) y usar un script para probarlo.
fuente
Jalea,
191817 bytesEste código calcula los primeros 2 n estados, por lo que no es particularmente rápido ni eficiente en memoria ...
Pruébalo en línea! o verificar los primeros 16 casos de prueba .
Versión alternativa, 13 bytes (no competitiva)
Las versiones de Jelly posteriores a este desafío tienen detección de bucle incorporada, lo que permite una solución que es más corta y más eficiente.
Esto maneja el último caso de prueba con facilidad. Pruébalo en línea!
Cómo funciona
Tenga en cuenta que el enlace auxiliar se aplica a 2 n en la primera iteración, que no codifica un estado válido. Sin embargo, ((2 n ÷ 2) ^ (2 n × 2))% 2 n = (2 n - 1 + 2 n + 1 )% 2 n = 2 n - 1 , que es uno de los posibles estados iniciales.
Como hacemos un bucle 2 n + 1 veces, tenemos la garantía de encontrar un estado dos veces, lo que hace que la detección del bucle sea exitosa.
fuente
CJam,
4134312725 bytesGracias a Dennis por guardar 3 bytes. Tomar prestada una idea de su respuesta de Jelly salvó otras 4.
Pruébalo aquí.
Explicación
Estoy representando el cable simplemente como un número entero (cuyos bits indican las posiciones de los electrones) en lugar de usar una lista real de bits. El estado se actualiza mediante cálculos bit a bit bastante simples.
Para encontrar el período, recopilamos todos los resultados intermedios en la pila, ejecutamos la simulación para 2 n-1 +1 pasos, y luego determinamos el período como el número de elementos desde la última aparición del estado final (más 1).
Aquí hay un desglose del código:
fuente
JavaScript (ES6) 99
104Prueba
fuente
Haskell, 170 bytes
x!p
da el elemento en el índice p si está dentro de los límites, de lo contrario, 0.n
calcula el siguiente paso.g i
da eli
paso th.c x
da el período, si comienza conx
.f
lo envuelve todo junto.(Nota: publicado desde un teléfono que tiene el intérprete de abrazos, que no tiene todas las funciones, por lo que podría tener errores tipográficos).
fuente
MATL ,
38373635 bytesEsto usa un ciclo que sigue calculando nuevos estados hasta que el nuevo estado sea igual a cualquiera de los anteriores. Cada estado es un vector de ceros y unos. Estos vectores se almacenan como filas de una matriz 2D en crecimiento.
El cálculo de cada nuevo estado se realiza convolucionando el estado actual con la secuencia
[1,0,1]
, manteniendo solo la parte central y configurando0
cualquier entrada que no lo sea1
.EDITAR (13 de mayo de 2016) El código en el siguiente enlace se ha modificado ligeramente de acuerdo con los cambios introducidos en el idioma después de que se escribió esta respuesta
Pruébalo en línea!
fuente
Perl 6, 81 bytes
Expandido y ungolfed un poco
Un poco de explicación:
[op]
reduce la lista usando op. Por ejemplo[+] @list
sumará@list
R
es un meta-op que invierte los argumentos dados a un op. Por ejemplo1 R- 3
resultará en 2.fuente
C ++, 211 bytes
Golfed
Con espacio en blanco agregado para facilitar la lectura
Buena práctica para el bitset de C ++; y una gran educación aprendiendo sobre el algoritmo de detección de ciclo de Brent (como lo utiliza @orlp)
fuente
Pyth, 95 bytes
Puedes probarlo aquí .
fuente
Pyth, 29 bytes
Utiliza el algoritmo
a(n+1) = ((a(n) << 1)^(a(n) >> 1)) % (2 ** N)
.fuente
Ruby, 72 bytes
Función anónima.
fuente