Eu estava brincando com autômato celular e encontrei um que tinha algum comportamento interessante. Veja como funciona:
Ele lê uma sequência de caracteres binária da esquerda para a direita; se encontrar uma 1seguida por 2outros valores, anexará 0a ao resultado e continuará lendo. Se encontrar um 0(ou restarem menos de 3 valores), ele acrescentará o valor atual e a 1e continuará lendo. No final da string, ele acrescentará um único 1ao resultado.
Aqui está um exemplo elaborado de uma geração
01011111
^
Primeiro encontramos um, 0então anexamos 01ao nosso resultado
01011111
^
01
Agora encontramos um, 1então adicionamos um zero e pulamos os próximos dois valores
01011111
^
010
Encontramos outro, 1então fazemos o mesmo
01011111
^
0100
Agora temos outro 1espaço, mas não o suficiente, para pular, então anexamos a célula atual e um 1(neste caso 11)
01011111
^
010011
Estamos no final, então anexamos um single 1e encerramos esta geração
01011111
^
0100111
Tarefa
Dada a entrada em qualquer formato razoável, você deve criar uma função ou programa que calcule uma geração do autômato.
Esta é uma questão de código-golfe, para que as respostas sejam pontuadas em bytes, com menos bytes sendo melhores.
Implementação de amostra
Aqui está uma implementação de amostra no Haskell (define uma função d, mas o programa imprime uma iteração indefinidamente):
d('1':_:_:x) = "0" ++ d x
d(a:x) = a:'1':d x
d x = "1"
r x = x:map d(r x)
10ele deve imprimir 11011? Eu acho que mais alguns casos de teste seria útil