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)
la source
10
il devrait s'imprimer11011
? Je pense que quelques cas de test supplémentaires seraient utilesRéponses:
V ,
262221 octetsMerci à @CowsQuack pour 4 octets en combinant des expressions régulières! Et @ ØrjanJohansen pour un autre octet avec quelques combinaisons d'expression régulière.
Essayez-le en ligne!
Utilise plusieurs fois le substitut et ajoute un 1 à la fin. Rien d'extraordinaire. J'ai une version qui remappe
1
et0
en mode insertion pour obtenir l'effet désiré, mais c'est un peu plus long.(Version de remplacement multiple: essayez-le en ligne! )
la source
Ó1ü0/&1
(ü
est\|
)Ó./&1
suivi deÓ31/0
.JavaScript (ES6), 56 octets
Prend l'entrée comme un tableau de caractères. Renvoie une chaîne ou le nombre
1
si un tableau vide est fourni.Démo
Afficher l'extrait de code
Version animée
Exemples d'entrées stables: 0101, 010011111
Afficher l'extrait de code
la source
Python 2 , 88 octets
Essayez-le en ligne!
la source
Python 2 , 89 octets
Essayez-le en ligne!
-4 octets grâce à Rod
-6 octets grâce à ovs
-1 octet grâce à micsthepick
la source
[0]if v else[x[y],1]
peut être réécrit comme[[x[y],1],[0]][v]
, mais vous pouvez inverser lav
valeur pour atteindre 96 octetsSwift 3 , 147 octets
-1 merci à @ Mr.Xcoder
Non golfé, renvoyant la valeur plutôt que l'impression:
la source
3<=s.count
par2<s.count
pour -1 octets .1
s dans l'entrée avec0 < element
plutôt queelement == 0
Python 2 , 81 octets
L'entrée et la sortie sont des listes (grâce à Erik l'Outgolfer)
Essayez-le en ligne!
Certains cas
Python 2 , 85 octets
L'entrée et la sortie sont des chaînes (solution initiale)
Essayez-le en ligne!
Certains cas
Explication Il s'agit simplement d'un golf d'une méthode récursive.
la source
1>Z[0]
place de0==Z[0]
.Perl 5 , 62 + 2 (
-F
) = 64 octetsEssayez-le en ligne!
la source
Scala , 131 + 29 = 160 octets
C'est à l'intérieur d'une fonction prenant la chaîne
a
en paramètre et retournant la sortie sous forme de chaîne.Je dois
import util.control.Breaks._
, j'ai donc besoin d'ajouter ces 28 octets plus un saut de ligne de fin.Essayez-le en ligne!
la source
C # (.NET Core) , 108 octets
Essayez-le en ligne!
Entrée prise sous forme de chaîne et une chaîne est renvoyée en sortie.
la source