Estaba jugando con un autómata celular y encontré uno que tenía un comportamiento interesante. Así es como funciona:
Lee una cadena binaria de izquierda a derecha, si encuentra un 1
seguido por 2
otros valores, agregará un 0
al resultado y continuará leyendo. Si encuentra a 0
(o quedan menos de 3 valores) agregará el valor actual y a 1
y continuará leyendo. Al final de la cadena, agregará un solo 1
al resultado.
Aquí hay un ejemplo resuelto de una generación
01011111
^
Primero nos encontramos con un, 0
así que agregamos 01
nuestro resultado
01011111
^
01
Ahora nos encontramos con un, 1
así que agregamos un cero y omitimos los siguientes dos valores
01011111
^
010
Nos encontramos con otro, 1
así que hacemos lo mismo.
01011111
^
0100
Ahora tenemos otro 1
espacio pero no suficiente para saltar, así que agregamos la celda actual y un 1
(en este caso 11
)
01011111
^
010011
Estamos al final, así que agregamos un single 1
y terminamos esta generación
01011111
^
0100111
Tarea
Dada la entrada en cualquier formato razonable, debe crear una función o programa que calcule una generación del autómata.
Esta es una pregunta de código de golf , por lo que las respuestas se puntuarán en bytes, con menos bytes mejor.
Implementación de muestra
Aquí hay una implementación de muestra en Haskell (define una función d
, pero el programa imprime una iteración 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
, ¿debería imprimirse 11011
? Creo que unos cuantos casos de prueba sería de gran ayuda