Je jouais avec un automate cellulaire et j'en ai trouvé un qui avait un comportement intéressant. Voici comment ça fonctionne:
Il lit une chaîne binaire de gauche à droite, s'il rencontre un 1
suivi par d' 2
autres valeurs, il ajoutera un 0
au résultat et continuera la lecture. S'il rencontre a 0
(ou s'il reste moins de 3 valeurs), il ajoutera la valeur actuelle et a 1
et continuera la lecture. À la fin de la chaîne, il en ajoutera un simple 1
au résultat.
Voici un exemple élaboré d'une génération
01011111
^
Nous rencontrons d'abord un 0
donc nous ajoutons 01
à notre résultat
01011111
^
01
Maintenant, nous rencontrons un 1
donc nous ajoutons un zéro et sautons les deux valeurs suivantes
01011111
^
010
On en rencontre un autre 1
donc on fait de même
01011111
^
0100
Nous avons maintenant un autre 1
espace mais pas assez pour sauter, donc nous ajoutons la cellule actuelle et un 1
(dans ce cas 11
)
01011111
^
010011
Nous sommes à la fin donc nous ajoutons un single 1
et terminons cette génération
01011111
^
0100111
Tâche
Étant donné l'entrée dans un format raisonnable, vous devez créer une fonction ou un programme qui calcule une génération de l'automate.
Il s'agit d'une question de code-golf donc les réponses seront notées en octets, avec moins d'octets étant mieux.
Exemple d'implémentation
Voici un exemple d'implémentation dans Haskell (définit une fonction d
, mais le programme imprime indéfiniment une itération):
d('1':_:_:x) = "0" ++ d x
d(a:x) = a:'1':d x
d x = "1"
r x = x:map d(r x)
10
il devrait s'imprimer 11011
? Je pense que quelques cas de test supplémentaires seraient utiles