Dado um número inteiro positivo N, determine o padrão inicial em uma grade N x N que produza a sequência não repetida mais longa sob as regras do Jogo da Vida e termina com um padrão fixo (ciclo de comprimento 1), tocado em um toro.
O objetivo não é o programa mais curto, mas o mais rápido.
Como o mundo é finito, você terminará em um ciclo, repetindo assim um estado já visitado. Se esse loop tiver o período 1, o padrão inicial será um candidato válido.
Saída: padrão inicial e número total de estados exclusivos na sequência (incluindo padrão inicial).
Agora, o toro 1x1 é especial, uma vez que uma célula pode ser considerada vizinha ou não, mas, na prática, não há problema, uma única célula viva em ambos os casos simplesmente morrerá (de superlotação ou solidão). Assim, a entrada 1 produz uma sequência de comprimento 2, sendo a sequência uma célula viva e depois morta para sempre.
A motivação para esta pergunta é que é um análogo da função de castor ocupado, mas definitivamente menos complexo, pois temos um limite na memória. Essa também será uma boa sequência para incluir no OEIS.
Para N = 3, o comprimento da sequência é 3, qualquer padrão no lado esquerdo atinge um quadrado 3x3 completamente preto e depois morre. (Todos os padrões que fazem parte de 1 ciclo são removidos).
fonte
Respostas:
C ++ até N = 6
Essa técnica é centrada em torno de uma função rápida do próximo estado. Cada placa é representada como uma máscara de bits de N ^ 2 bits, e truques de bits pequenos são usados para calcular o próximo estado de todas as células de uma só vez.
next
compila até200100 instruções de montagem para N <= 8. Em seguida, fazemos apenas o teste padrão de todos os estados até que eles se repitam e escolhemos o mais longo.Leva alguns segundos até 5x5, algumas horas para 6x6.
fonte
next
contando e não classificando.#define H(x,y){x^=y;y&=(x^y);}
e então algo parecido comH(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;
Vejo as seguintes abordagens de solução possíveis:
Next(board)
função, vemos que ela tem alguns benefícios, embora não tantos quanto eu originalmente esperava.Prev2
.Eu não acho que a micro-otimização me permita acompanhar o código de Keith, mas por uma questão de interesse, postarei o que tenho. Isso resolve N = 5 em cerca de um minuto em uma máquina de 2 GHz usando Mono 2.4 ou .Net (sem PLINQ) e em cerca de 20 segundos usando PLINQ; N = 6 é executado por muitas horas.
fonte
Fator
Algumas estatísticas de tempo:
E o teste 5 travou o REPL. Hmph. A parte mais ineficiente do programa é provavelmente a função sequência do jogo. Talvez eu consiga melhorar depois.
fonte