Dado un número entero positivo N, determine el patrón de inicio en una cuadrícula N x N que produzca la secuencia no repetida más larga según las reglas del Juego de la Vida, y termine con un patrón fijo (ciclo de longitud 1), jugado en un toro.
El objetivo no es el programa más corto, sino el más rápido.
Como el mundo es finito, eventualmente terminarás en un bucle, repitiendo así un estado ya visitado. Si este ciclo tiene período 1, entonces el patrón inicial es un candidato válido.
Salida: patrón de inicio y número total de estados únicos en la secuencia (incluido el patrón de inicio).
Ahora, el 1x1-toro es especial, ya que una célula puede considerarse vecina a sí misma o no, pero en la práctica, no hay problema, una sola célula viva en cualquier caso simplemente morirá (de hacinamiento o soledad). Por lo tanto, la entrada 1 produce una secuencia de longitud 2, la secuencia es una célula viva y luego muerta para siempre.
La motivación para esta pregunta es que es un análogo de la función de castor ocupado, pero definitivamente menos complejo, ya que tenemos un límite en la memoria. Esta será una buena secuencia para incluir también en OEIS.
Para N = 3, la longitud de la secuencia es 3, cualquier patrón en el lado izquierdo alcanza un cuadrado de 3x3 completamente negro, y luego muere. (Todos los patrones que forman parte de 1 ciclo se eliminan).
fuente
Respuestas:
C ++ hasta N = 6
Esta técnica se centra en una función rápida de estado siguiente. Cada placa se representa como una máscara de bits de N ^ 2 bits, y se utilizan trucos de bits para calcular el siguiente estado para todas las celdas a la vez.
next
compila hasta aproximadamente200100 instrucciones de ensamblaje para N <= 8. Luego, simplemente hacemos el estándar try-all-states-hasta que se repitan y elegimos el más largo.Toma unos segundos hasta 5x5, unas pocas horas para 6x6.
fuente
next
al contar en lugar de ordenar.#define H(x,y){x^=y;y&=(x^y);}
y luego algo así comoH(n1,n2);H(n3,n4);H(n5,n6);H(n7,n8);H(n1,n3);H(n5,n7);H(n2,n4);H(n6,n8);H(n1,n5);H(n3,n7);H(n2,n6);H(n2,n3);H(n2,n5); return n2 & (b | n1) & ~(n3|n4|n5|n6|n7|n8) & ALL;
Veo los siguientes posibles enfoques de solución:
Next(board)
función, vemos que tiene algunos beneficios, aunque no tantos como esperaba originalmente.Prev2
.No creo que la microoptimización me permita ponerme al día con el código de Keith, pero por interés, publicaré lo que tengo. Esto resuelve N = 5 en aproximadamente un minuto en una máquina de 2 GHz usando Mono 2.4 o .Net (sin PLINQ) y en aproximadamente 20 segundos usando PLINQ; N = 6 carreras por muchas horas.
fuente
Factor
Algunas estadísticas de tiempo:
Y la prueba 5 estrelló el REPL. Hmph La parte más ineficiente del programa es probablemente la función secuencia del juego. Tal vez pueda mejorarlo más tarde.
fuente