O Jogo da Vida de Conway é o exemplo clássico de automação celular. As células formam uma grade quadrada e cada uma tem dois estados: vivos ou mortos. Em cada turno, cada célula é atualizada simultaneamente de acordo com seu estado e o de seus oito vizinhos:
- Uma célula viva permanece viva se tiver exatamente dois ou três vizinhos vivos
- Uma célula morta ganha vida se tiver exatamente três vizinhos vivos
Sua missão, se você optar por aceitá-la, é codificar a implementação mais curta do Game of Life no seu idioma favorito.
As regras:
- A grade deve ter pelo menos 20x20
- A grade deve envolver (para que a grade seja como a superfície de um Torus)
- Sua implementação deve permitir que o usuário insira seus próprios padrões iniciais
- GoL é um pouco inútil se você não pode ver o que está acontecendo, portanto deve haver saída visual do autômato em execução, com o resultado de cada turno sendo mostrado por tempo suficiente para ser visto!
code-golf
game-of-life
cellular-automata
Griffin
fonte
fonte
;
antes de}
s. Tambémvar
s podem ser eliminados às vezes (se não quebrar seu código). E para uma linhafor
s,if
s etc, você pode eliminar o{ }
completamente:for(...) for(...) dosomething()
.Respostas:
Canvas HTML5 com JavaScript,
940639586519 personagensEu sempre quis fazer algo com canvas, então aqui está minha tentativa (versão original online ). Você pode alternar as células clicando em (também possível no modo de execução).
Agora você também pode experimentar a nova versão aqui .
Infelizmente, existe um problema que ainda não consegui solucionar. A versão online tem 11 caracteres a mais porque o jsFiddle coloca um nó de texto imediatamente antes da tela (por quê?) E, portanto, a tela não é mais o primeiro filho.
Edit 1: Muitas otimizações e reestruturações.
Edit 2: Várias mudanças menores.
Edit 3: Inline o bloco de script completo mais pequenas alterações.
fonte
1
torná-lo tão rápido quanto o meu, em vez de pisar devagar. Além disso, se você deseja implementar o desenho (em vez de clicar em cada quadrado), pode arredondar a posição do mouse para o tamanho de bloco mais próximo e preencher o retângulo nesse ponto. Mais personagens, mas mais pontos.new Array('#FFF','#800')
por['#FFF','#800']
.s
matriz comotan
e,red
uma vez que são as duas cores com as representações mais curtas - economiza dois caracteres. Além disso, se possível, coloque a versão literal dej
no intervalo. Tenho certeza de que há muito mais para se espremer também.Python, 219 caracteres
Eu fui para o golfe máximo, com interface apenas o suficiente para satisfazer a pergunta.
Você executa assim:
Os números na lista representam as coordenadas das células iniciais. A primeira linha é 0-19, a segunda linha é 20-39, etc.
Execute-o em um terminal com 21 linhas e parece bem legal.
fonte
2-(p in P)
==2-({p}<P)
. Mas então você teria que mudar sua entrada para{8,29,47,48,49}
:)TI-BASIC, 96 bytes (87 para entradas não concorrentes)
Para a sua calculadora gráfica da série TI-84 (!). Este foi um grande desafio, porque não há nenhuma maneira fácil de escrever uma gráfica rotina tamponada (definitivamente nada embutido), ea tela do gráfico tem comandos apenas quatro gráficos relevantes:
Pxl-On()
,Pxl-Off()
,Pxl-Change()
, epxl-Test()
.Usa todos os pixels acessíveis na tela e envolve corretamente. Cada célula é um pixel e o programa atualiza linha por linha horizontalmente à direita na tela. Como as calculadoras possuem apenas um processador z80 de 15MHz e o BASIC é uma linguagem de interpretação lenta, o código obtém apenas um quadro a cada cinco minutos.
A entrada do usuário é fácil: antes de executar o programa, use a ferramenta Caneta para desenhar sua forma na tela do gráfico.
Adaptado da minha inscrição para um concurso de código de golfe no fórum da calculadora Omnimaga .
Versão Omnimaga (87 bytes)
Esse código possui um recurso adicional: detecta se está sendo executado pela primeira vez e se randomiza o estado da tela. Nas execuções subsequentes, a simulação continua automaticamente se for interrompida após o término de um quadro. No entanto, não é uma entrada concorrente porque não quebra a tela; as células na borda externa sempre serão consideradas mortas se a tela do gráfico for limpa anteriormente.
Esta versão é provavelmente o código mais elaborado que já escrevi e contém algumas otimizações ofuscantes realmente desagradáveis:
Eu uso o estado do relógio como uma bandeira. No início do programa, o relógio de data / hora está ativado e eu uso o valor do sinalizador global isClockOn para determinar se é a primeira iteração. Depois que o primeiro quadro é desenhado, desligo o relógio. Economiza um byte sobre o outro método mais curto e cerca de quatro sobre o método óbvio.
Eu armazeno os estados das três colunas ao lado da que está sendo atualizada em uma matriz de 63 elementos com base 7. O local dos 49 mantém a coluna à direita, o local dos 7 mantém a coluna do meio e o local das unidades mantém a coluna da esquerda - 1 para uma célula viva e 0 para uma célula morta. Então eu pego o mod 6 restante da soma dos três números ao redor da célula que está sendo modificada para encontrar o número total de células vizinhas vivas (é como a divisibilidade por 9 truques - na base 7, o mod 6 restante é igual à soma de os dígitos). Economiza cerca de 10 bytes por si só e oferece a oportunidade de usar as próximas duas otimizações. Diagrama de exemplo (digamos que exista um planador centralizado em uma determinada coluna em Y = 45:
A célula central permanecerá morta, porque está cercada por exatamente cinco células vivas.
Após a conclusão de cada linha, os números na matriz são atualizados dividindo os números existentes por 7, descartando a parte decimal e adicionando 49 vezes os valores das células na nova coluna. Armazenar todas as três colunas de cada vez seria muito mais lento e menos elegante, consumir pelo menos mais 20 bytes e usar três listas em vez de uma, porque os valores das células em cada linha devem ser armazenados antes que as células sejam atualizadas. Essa é de longe a menor maneira de armazenar as posições das células.
O trecho
int(3fPart(3cosh(
fornece1
quando a entrada é igual a 3/6,2
quando é igual a 4/6 e0
quando é igual a 0, 1/6, 2/6 ou 5/6. Economiza cerca de 6 bytes.fonte
Mathematica - 333
Recursos:
Interface interativa: clique nas células para criar seus padrões
Grade agradável
Botões: EXECUTAR, PAUSAR, LIMPAR
O código está abaixo.
Se você quiser entender como isso funciona, o segundo exemplo deste blog é apenas uma versão mais elaborada (análise ao vivo de Fourier, melhor interface) do código acima. O exemplo deve ser executado diretamente no seu navegador após o download gratuito do plugin.
fonte
Caracteres C 1063
Como desafio, fiz isso em C usando a API do Windows, hostil ao golfe, para E / S em tempo real. Se o capslock estiver ativado, a simulação será executada. Ele ficará parado se o capslock estiver desativado. Desenhe padrões com o mouse; clique esquerdo revive células e clique direito mata células.
O EXE compilado pode ser encontrado aqui
Edit: eu comentei a fonte. Está disponível aqui
fonte
J (39 caracteres)
Baseado nesta versão do APL (mesmo algoritmo, convolução toroidal).
Exemplo de uso:
fonte
Mathematica, 123 caracteres
Uma implementação muito rudimentar que não usa a função CellularAutomaton interna do Mathematica.
fonte
Ruby 1.9 + SDL (
380325314)EDIT : 314 caracteres e corrigido um erro com células extras aparecendo ativas na primeira iteração. Aumentou o tamanho da grade para 56, uma vez que a rotina de cores analisa apenas os 8 bits mais baixos.
Edição : Golfed até 325 caracteres. A largura / altura da grade agora é 28, pois 28 * 9 é a maior que você pode ter enquanto ainda usa o valor como cor de fundo. Ele também processa apenas um evento SDL por iteração agora, o que evita completamente o loop interno. Bem apertado, eu acho!
A simulação começa em pausa, com todas as células mortas. Você pode pressionar qualquer tecla para alternar entre pausar / não pausar e clicar em qualquer célula para alternar entre viva e morta. Executa uma iteração a cada décimo de segundo.
A embalagem é um pouco instável.
Se parece com isso:
Desafio divertido! Congratulo-me com quaisquer melhorias que alguém possa ver.
fonte
Scala,
118111581128106310181003999992987 caracteresUngolfed:
A maior parte do código aqui é material da GUI do Swing. O jogo em si está no
actionPerformed
método que é acionado peloTimer
, e a função auxiliarn
que conta os vizinhos.Uso:
Compile-o
scalac filename
e execute-o comscala L
.Clicar em um quadrado vira-o de vivo para morto, e a opção de menu inicia e para o jogo. Se você deseja alterar o tamanho da grade, altere os três primeiros valores da linha:
var(w,h,c,d,r)=(20,20,20,0,false)
eles são largura, altura e tamanho da célula (em pixels), respectivamente.fonte
import java.awt.event._
econtents+=m("Go",true)+=m("Stop",false)}}
, levando a 1093 caracteres.Pure Bash, 244 bytes
Funciona em um universo 36x24 envolto em toroidal:
Como este é um script shell, o método de entrada é congruente com outros comandos shell - ou seja, do stdin:
... etc
Podemos redirecionar a entrada de qualquer fonte de texto, canalizada através de um
tr
filtro para obter gerações iniciais interessantes, por exemplofonte
JavaScript, 130
Não respondendo totalmente ao desafio, mas, para constar, aqui está um mecanismo do Game of Life em 130 bytes, criado por Subzey e eu em 2013.
http://xem.github.io/miniGameOfLife/
fonte
@@\n@@
(quadrado 2 por 2 no canto superior esquerdo) ou.@\n.@\n.@
. (Coluna 1 por 3)C # - 675 caracteres
Eu sempre quis escrever uma versão deste programa. Nunca soube que levaria apenas meia hora preguiçosa para uma versão rápida e suja. (O golfe leva muito mais tempo, é claro.)
Uso
Compromissos de golfe
fonte
GW-BASIC,
10861035 bytes (tokenizado)No formato tokenizado, são 1035 bytes. (O formulário ASCII é, é claro, um pouco mais longo.) Você obtém o formulário tokenizado usando o
SAVE"life
comando sem anexar",a
no intérprete.Esta é a versão com o máximo de golfe, mas ainda com muitos recursos: ao iniciar, você recebe um editor, no qual pode se mover com as teclas do cursor; O espaço ativa / desativa as bactérias no campo atual,
c
limpa a tela e Return inicia o modo de jogo.A seguir, uma versão menos ofuscada, que também define um tabuleiro de jogo inicial com duas estruturas (uma coisa de rotação circular e um planador):
Escrevi isso em 15 minutos enquanto estava entediado e esperando por um amigo, que jogava golfe com seu “aprendiz” no jogo da vida de Conway, ao mesmo tempo.
Funciona assim: Usa imediatamente o buffer de tela de modo de texto de 80x25 (altere a inicial
DEF SEG
a ser usada&hB000
se você estiver em uma placa gráfica Hercules; essas configurações funcionam com o Qemu e o dosbox (mais lento)). Um asterisco*
é uma bactéria.Ele funciona em duas passagens: primeiro, os locais de nascimento são marcados com
+
e a morte marca seus alvos.
. Na segunda passagem,+
e.
são substituídos por*
e, respectivamente.
O
TIMER
importante é fazer com que espere meio segundo após cada rodada, caso o seu host Qemu seja muito rápido ☺Eu não estou esperando por um preço de menor ganho aqui, mas por um preço bacana, especialmente considerando a configuração inicial do quadro. Eu também tenho uma versão em que o mecanismo do jogo foi substituído pelo código de montagem, caso você esteja interessado…
fonte
1
,2
,3
, etc.) Ou será que os números de linha não contam?Mathematica, 115 bytes
Aqui está uma cópia fácil para isso:
fonte
Java (OpenJDK 8) -
400 388367 bytesSegunda e (provavelmente) Edição Final: Conseguiu jogar um extra de 21 bytes depois de encontrar essas (imo) minas de ouro - definitivamente recomendo que novas pessoas as leiam (especialmente se você tentar alguns desses desafios usando Java).
Código resultante (provavelmente acabará jogando golfe ainda mais se eu descobrir como reduzir os duplos aninhados para loops ...):
Experimente online!
(A postagem original começa aqui.)
Na verdade, pensei por um momento que eu seria capaz de, pelo menos, desafiar a melhor resposta em Python com meu conhecimento (possivelmente limitado) de Java lol ... Foi um desafio no qual eu gostei de participar (apesar de ter me juntado à festa talvez apenas um um pouco tarde ...)
Na verdade, não há muito - explicação básica da seguinte maneira (não destruída):
(mais informações sobre instruções lambda no Java 8 aqui )
Sim, há um problema com minha abordagem.
Como muitos de vocês já devem ter notado, meu código de golfe atual permanece em loop para sempre. Para evitar isso, um contador pode ser introduzido na parte superior e usado no loop while para exibir apenas
n
(neste caso, 5) iterações da seguinte maneira (observe a novab
variável adicionada):Além disso, alguns pontos que vale a pena mencionar. Este programa não verifica se a entrada está correta e, portanto, falhará com (provavelmente) an
ArrayOutOfBoundsException
; como tal, verifique se a entrada é válida preenchendo completamente uma parte de uma matriz (matrizes no espeto lançarão a exceção mencionada acima). Além disso, o quadro atual parece "fluido" - isto é, não há separação entre uma geração e a seguinte. Se você deseja adicionar isso para verificar se as gerações que estão sendo produzidas são realmente válidas, éSystem.out.println();
necessário adicionar mais um pouco antesfor(int[]t:u)Arrays.fill(t,0);
(consulte a seção Experimente online! Para maior clareza). E por último, mas não menos importante, dado que este é o meu primeiro código de golfe, qualquer feedback é muito apreciado :)Código antigo da resposta anterior de 388 bytes:
E a partir da resposta inicial de 400 bytes:
fonte
Estêncil , 6 bytes
Não é meu idioma favorito, mas é curto…
4 bytes de código mais os
∊
sinalizadores nlist eT
orus.Experimente online!
É ...
3
3∊
um membro dem
a m oore-bairro-count com auto oue
o pântano e -neighbourhood-count sem auto...?
fonte
Scala - 799 caracteres
Execute como um script. Um clique do mouse em um quadrado o ativa ou desativa e qualquer tecla inicia ou interrompe a geração.
fonte
J, 45
Eu pensei em dar uma chance a J. Ainda não está particularmente bem jogado, mas tentarei outra vez em breve.
Exemplo:
fonte
Processando
536532Acredito que isso satisfaça todos os requisitos.
Ungolfed:
fonte
Matlab (152)
Não tenho o Matlab instalado agora para testá-lo, apenas joguei o código que escrevi alguns anos atrás.
Ungolfed:
fonte
Perl,
218216211202 bytes(Nenhuma nova linha no final deste código.)
Lê o padrão inicial da entrada padrão, como um arquivo de texto em que as células vivas são representadas como
1
, as células mortas são representadas como um espaço, as linhas são separadas por uma nova linha. A entrada não deve ter caracteres diferentes desses. As linhas podem ter comprimento variável e serão preenchidas ou truncadas com exatamente 79 de largura. Exemplo de entrada é uma pistola de asa delta:À medida que o programa executa o Game of Life, todos os estados são transferidos para a saída padrão em um formato semelhante à entrada e atrasam 0,1 segundos. O atraso pode ser personalizado alterando o quarto argumento da chamada de seleção.
O tabuleiro do jogo é codificado no tamanho 79x23. Está envolto em um toro: se você deixar a prancha no fundo, acaba no topo; se você sair do lado direito, acaba no lado esquerdo, mas mudou uma linha para baixo.
Aqui está uma versão alternativa que não lê nenhuma entrada e começa em um quadro aleatório:
Este código é derivado de um programa ofuscado da vida perl que escrevi anos atrás . Eu mudei muito para tornar o tabuleiro toroidal e o código do golfe.
Este provavelmente não é o método mais curto para implementar o Game of Life em perl, mas é um dos menos compreensíveis.
fonte
Python, 589 bytes
Botões do mouse: esquerda - coloque uma célula, direita - remova uma célula, meio - inicie / pare.
E aqui está uma versão onde você pode arrastar o mouse para desenhar. Os gráficos são um pouco mais agradáveis.
fonte
if 1<n<4:
deve ser recuada no mesmo nível quefor j in z(-1,2):
Python 2, 456 bytes
Embora eu saiba que este é um post antigo, não pude deixar de tentar. O quadro inicial pode ter qualquer tamanho, desde que você desenhe uma borda ao redor e tenha um espaço extra na última linha.
Golf.py
Input.txt (observe o espaço extra na última linha)
Como executar
fonte
time.sleep(0.1)==None
=>not time.sleep(.1)
,(f=='@'and(x==3 or x==2
)) ou (f == '' e x == 3) =>x==3or f=='@'and x==2
1 if
=>1if
.Em processamento
270.261249 bytesGrade é os 100 * 100 pixels da tela, a entrada vem na forma de uma imagem png
Ungolfed
fonte
Lua + LÖVE / Love2D , 653 bytes
ou espaçados:
Clique no campo para adicionar células vivas. Clique fora do campo para executá-lo.
Experimente online!
fonte
Postscript
529515Começou com o exemplo do código Rosetta . Invoque com um argumento de nome de arquivo (
gs -- gol.ps pulsar
), o arquivo que contém 20 * 20 números binários (separados por espaço). Loop infinito: prancheta, aguarde enter, calcule a próxima geração.Espaçado, com alguns comentários da pilha (apenas os que eu precisava).
arquivo de dados pulsar:
fonte
JavaScript 676
Desculpe Griffin, eu simplesmente não conseguia olhar para o seu código e não reescrevê-lo um pouco ... tive que raspar dois caracteres, mas valeu a pena!
b=[];r=c=s=20;U=document;onload=function(){for(z=E=0;z<c;++z)for(b.push(t=[]),j=0;j<r;j++)with(U.body.appendChild(U.createElement("button")))t.push(0),id=z+"_"+j,style.position="absolute",style.left=s*j+"px",style.top=s*z+"px",onclick=a}; ondblclick=function(){A=E=E?clearInterval(A):setInterval(function(){Q=[];for(z=0;z<c;++z){R=[];for(j=0;j<r;)W=(c+z-1)%c,X=(c+z+1)%c,Y=(r+j-1)%r,Z=(r+j+1)%r,n=b[W][Y]+b[z][Y]+b[X][Y]+b[W][j]+b[X][j]+b[W][Z]+b[z][Z]+b[X][Z],R.push(b[z][j++]?4>n&&1<n:3==n);Q.push(R)}b=Q.slice();d()})};function a(e){E?0:P=e.target.id.split("_");b[P[0]][P[1]]^=1;d()}function d(){for(z=0;z<c;++z)for(j=0;j<r;)U.getElementById(z+"_"+j).innerHTML=b[z][j++]-0}
Mas, como eles dizem, é mais fácil pedir perdão do que permissão ...;)
fonte
Oitava (153)
o mesmo que Matlab por DenDenDo no Shortest Game of Life , mas teve que mudar imshow para imagesc:
fonte
Python 2: 334 bytes
Apenas 6 anos atrasado.
Você pode executá-lo como:
Onde os 0s e 1s representam células mortas e vivas, uma nova linha extra no final inicia a execução.
As grades devem ser quadradas.
É mais fácil de executar do que o python mais curto, suporta grades de qualquer tamanho e fica bonito quando executado.
Também é 100 bytes a mais, então é isso.
fonte
PHP, 201 bytes (não testado)
Corra com
-nr
.demolir
fonte