Desafio:
Dada uma matriz (ou matriz 2d) de 0s e 1s, produza o número de etapas necessárias para que o jogo da vida de Conway atinja um estado estável, ou -1, se nunca chegar a um. Um estado estável é um estado no qual nenhuma célula é ativada ou desativada a cada etapa. O jogo deve ser executado na matriz especificada, com o topo e o fundo conectados e os lados conectados. (ou seja, dada uma matriz 4x3, ela deve ser executada em um toro 4x3) A matriz de entrada não será maior que 15x15.
Nota: Se a matriz iniciar em um estado estável, a saída deverá ser 0.
Amostras:
Entrada:
[[0,0,0],
[0,1,1],
[0,1,0]]
Resultado:
2
Processo: (isso não precisa ser exibido)
[[0,0,0],
[0,1,1],
[0,1,0]]
[[1,1,1],
[1,1,1],
[1,1,1]]
[[0,0,0],
[0,0,0],
[0,0,0]]
Entrada:
[[0,0,1,1],
[0,1,1,1],
[0,1,0,0],
[0,1,1,1]]
Resultado:
2
Processo:
[[0,0,1,1],
[0,1,1,1],
[0,1,0,0],
[0,1,1,1]]
[[0,0,0,0],
[0,1,0,1],
[0,0,0,0],
[0,1,0,1]]
[[0,0,0,0],
[0,0,0,0],
[0,0,0,0],
[0,0,0,0]]
Entrada:
[[0,1,0,0],
[0,1,0,0],
[0,1,0,0],
[0,0,0,0]]
Resultado:
-1
Processo:
[[0,1,0,0],
[0,1,0,0],
[0,1,0,0],
[0,0,0,0]]
[[0,0,0,0],
[1,1,1,0],
[0,0,0,0],
[0,0,0,0]]
[[0,1,0,0],
[0,1,0,0],
[0,1,0,0],
[0,0,0,0]]
repetindo para sempre
Entrada:
[[0,0,0,0],
[0,0,0,1],
[0,1,1,1],
[0,0,1,0]]
Resultado:
4
Processo:
[[0,0,0,0],
[0,0,0,1],
[0,1,1,1],
[0,0,1,0]]
[[0,0,0,0],
[1,0,0,1],
[1,1,0,1],
[0,1,1,1]]
[[0,1,0,0],
[0,1,1,1],
[0,0,0,0],
[0,1,0,1]]
[[0,1,0,1],
[1,1,1,0],
[0,1,0,1],
[1,0,1,0]]
[[0,0,0,0],
[0,0,0,0],
[0,0,0,0],
[0,0,0,0]]
Entrada:
[[0,0,0,0],
[0,1,1,0],
[0,1,1,0],
[0,0,0,0]]
Resultado:
0 0
Processo:
O estado inicial é estável.
Regras do Jogo da Vida
Se uma célula que está desativada (0) estiver ao lado de exatamente três (1), ela estará ativada. Caso contrário, é deixado de fora. Se uma célula que está ligada é próxima de 2 ou 3 em quadrados, ela diz que está. Caso contrário, está desligado.
Respostas:
Mathematica,
130129 bytesEu não recomendaria tentar mais do que entradas 4x4, porque isso levará uma eternidade (e muita memória).
Explicação
Este simplesmente simula o jogo da vida para 2 N etapas, onde N é o número de células na entrada. Isso garante que, se o sistema se estabilizar, chegamos a ele. Posteriormente, encontramos o primeiro par de estados idênticos consecutivos na história simulada.
Vamos analisar o código:
Isso calcula 2 N , pois
Join@@
é usado para achatar uma lista 2D.Isso simula o Jogo da Vida para 2 N gerações. A matriz 3x3 especifica a vizinhança de um autômato 2D totalístico e
224
é o número da regra do Game of Life padrão. Eu escrevi sobre como calcular esse número aqui no Mathematica.SE .Isso obtém todos os pares consecutivos (sobrepostos) de gerações.
Ele localiza o primeiro par de gerações idênticas, padronizando
0
se nenhum for encontrado e limitando a pesquisa a profundidade1
. Se esse par for encontrado, o resultado será retornado em uma lista. Então usamos:Para extrair o primeiro elemento dessa lista (o valor padrão de
0
, sendo atômico, não é afetado por isso).Por fim, subtraímos um porque o desafio espera
0
índices baseados-1
em falhas e falhas.fonte
Lua,
531509488487464424405404 bytesQuem quer uma submissão maciça? \ o /
Edit: Melhorado, mas não sei mais jogar golfe, então ...
explicações estão chegandocomentários adicionados :)Salvo ~ 60 bytes com a ajuda de @ KennyLau
pequeno corte golfe um byte mais renomeando
a
emY
para prevenir a conversão hexadecimal sequenciadosUngolfed
Casos de teste
Aqui estão alguns casos de teste
fonte
Geléia,
2625 bytesExperimente online! ou verifique todos os casos de teste .
Casos de teste maiores ( da resposta de @ Katenkyo ): 15 × 15 estáveis | Planador 15 × 14
Como funciona
fonte
Perl,
154151144140137133129 bytesInclui +3 para
-ap0
Execute com a entrada como uma linha de grupos de dígitos separados por espaço
Isso só é realmente necessário caso a entrada seja imediatamente estável. Em todos os outros casos, você também pode fornecer de forma mais conveniente linhas de dígitos separadas:
Dar entrada dessa maneira, no entanto, forneceria 1 em vez de 0 para uma configuração imediatamente estável.
life.pl
:Quase batendo o Mathematica neste ...
Somente nas versões perl mais antigas (nas quais você pode usar uma constante como variável) esta solução de 126 bytes funciona:
Caso haja pelo menos 2 linhas, esta solução de 123 bytes funciona em todas as versões perl:
fonte
rubi, 207 bytes
Eu mantenho um histórico de cada placa, por isso, se eu tiver uma placa que já vi antes de saber que uma das duas coisas aconteceu. primeiro, pode ser que tenhamos encontrado uma posição estável, caso em que será a mais ressentida em nossa história. a outra possibilidade é que tenhamos um loop.
fonte
15*15*4*1000
-> 900 KB, bom o suficiente para casos em que precisaremos de 10k + gens :).Julia,
9288 bytesVerificação
fonte