Você recebe como entrada uma imagem em escala de cinza. Sua tarefa é encontrar um padrão estático ou em loop no Game of Life de Conway que se assemelha à imagem de entrada o mais próximo possível.
Sua saída pode ser tanto uma imagem estática ou uma animação de looping em algum formato que podem ser convertidas em GIF. As dimensões da imagem de saída devem ser as mesmas da entrada e devem conter apenas pixels em preto e branco.
Se a saída for uma animação, cada quadro deverá ser gerado a partir do anterior, de acordo com as regras do Jogo da Vida, com uma célula por pixel. A animação deve fazer um loop, com o primeiro quadro sendo gerado a partir do último quadro pelas mesmas regras.
Se a saída for uma imagem estática, a aplicação das regras do jogo da vida deverá produzir a mesma imagem. Isso significa que nenhuma célula 'viva' pode ter mais de três ou menos que dois vizinhos 'vivos' e nenhuma célula 'morta' pode ter exatamente três vizinhos 'vivos'. (Observe que isso é basicamente o mesmo que uma animação, conforme descrito acima, mas com apenas um quadro.)
Regras e esclarecimentos extras:
Você (ou seu programa) pode escolher se as células 'vivas' são representadas como brancas e 'mortas' como pretas, ou vice-versa. Ou seja, você pode codificar isso ou seu programa pode escolher com base na imagem de entrada. (Mas deve ser o mesmo para todos os quadros da animação.)
As condições de contorno devem ser periódicas, o que significa que as células na coluna da direita têm vizinhos na coluna da esquerda, etc.
Para animações, a taxa de quadros depende de você (ou do seu programa); Eu imagino que taxas de quadros rápidas funcionem bem para aproximar pixels cinzas.
Poste pelo menos dois resultados incorporados em sua resposta. Se você pode publicar resultados de todas as imagens de entrada abaixo, é preferível.
É aceitável reduzir as imagens de teste, se necessário, para obter gifs com tamanhos de arquivo pequenos o suficiente. Se você também deseja vincular a arquivos maiores, tudo bem. Se você deseja exibir, sinta-se à vontade para encontrar alguns arquivos de origem de resolução mais alta.
Tente evitar ter muitos parâmetros controláveis em seu código - é melhor se a única entrada do seu programa for a imagem. A exceção é se você deseja ter um parâmetro para controlar o número de quadros de animação, pois isso afetará o tamanho do arquivo.
Você pode usar programas externos para alterar o formato dos arquivos de entrada e saída e / ou compilar os quadros de saída em uma animação, se desejar. (Este não é um desafio de manipulação de formato de arquivo.)
Este é um concurso de popularidade , então a resposta com mais votos vence.
Aqui está uma seleção de imagens de teste, tiradas principalmente de outras perguntas neste site. (É possível adicionar mais imagens de entrada de "bônus" posteriormente.)
Apenas para começar, aqui está uma tentativa de referência muito burra no Python 2, que tira proveito do fato de que um bloco de quatro quadrados é uma estrutura estável no Game of Life. Ele apenas redimensiona a imagem de entrada por um fator de 4 e desenha um bloco se o pixel correspondente for mais escuro que 0,5.
from skimage import io
from skimage import transform
import sys
img = io.imread(sys.argv[1],as_grey=True)
source = transform.resize(img, [i/4 for i in img.shape])
img[:]=1
for x in xrange(source.shape[0]):
for y in xrange(source.shape[1]):
if source[x,y]<0.5:
img[x*4, y*4] = 0
img[x*4+1, y*4] = 0
img[x*4, y*4+1] = 0
img[x*4+1, y*4+1] = 0
io.imsave(sys.argv[2], img)
Aqui estão algumas saídas do código de exemplo. Tenho certeza de que são possíveis resultados muito melhores.
Respostas:
Python
Aperte os olhos:
O código é impresso nos pixels mais brancos com a natureza-morta padrão mais adequada . Há um argumento de corte para que você decida se o limiar de arredondamento para preto e branco vai. Eu experimentei viver-é-branco e o resultado é o mesmo.
fonte
#Python
Java
Uma abordagem baseada em detecção de borda. Requer esse arquivo de texto no diretório em execução.
Alguns resultados:
fonte
C ++
Abordagem direta de pixelização usando a média de cada grade 8x8 para selecionar uma grade de saída 8x8 (uma "textura de cor"). Cada grade de saída 8x8 possui um separador de 2 células na parte superior e direita. As grades foram projetadas variando de naturezas-mortas de 4 células a 18 naturezas-mortas de células nos restantes pixels 6x6.
O programa atua como um filtro do PGM binário para o PBM binário. Por padrão, as imagens são "escuras"; preto é morte e branco é vida;
-i
inverte isso.-g [value]
adiciona uma gama, que é usada para pré-ponderar as médias antes de selecionar as texturas de cores.Resultados selecionados (observação: todos os pbm foram convertidos em png usando um programa de terceiros para upload):
Escher, gama 2.2
Mona Lisa, gama 2.2
Oceano, gama 2.2 invertido
Filhote de cachorro, gama 2.2
Traição de Imagens, gama 2.2 invertida
Mona Lisa gama 2.2, invertida, para comparação
fonte