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 1
seguida por 2
outros valores, anexará 0
a ao resultado e continuará lendo. Se encontrar um 0
(ou restarem menos de 3 valores), ele acrescentará o valor atual e a 1
e continuará lendo. No final da string, ele acrescentará um único 1
ao resultado.
Aqui está um exemplo elaborado de uma geração
01011111
^
Primeiro encontramos um, 0
então anexamos 01
ao nosso resultado
01011111
^
01
Agora encontramos um, 1
então adicionamos um zero e pulamos os próximos dois valores
01011111
^
010
Encontramos outro, 1
então fazemos o mesmo
01011111
^
0100
Agora temos outro 1
espaç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 1
e 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)
10
ele deve imprimir 11011
? Eu acho que mais alguns casos de teste seria útil