Stavo giocando con un automa cellulare e ne ho trovato uno che aveva un comportamento interessante. Ecco come funziona:
Legge una stringa binaria da sinistra a destra, se incontra un 1
seguito da 2
altri valori aggiungerà 0
a al risultato e continuerà a leggere. Se rileva un 0
(o sono rimasti meno di 3 valori), aggiungerà il valore corrente e un 1
e continuerà a leggere. Alla fine della stringa, verrà aggiunto un singolo 1
al risultato.
Ecco un esempio elaborato di una generazione
01011111
^
In primo luogo incontriamo un 0
così aggiungiamo 01
al nostro risultato
01011111
^
01
Ora incontriamo un 1
così aggiungiamo uno zero e saltiamo i prossimi due valori
01011111
^
010
1
Ne incontriamo un altro, quindi facciamo lo stesso
01011111
^
0100
Ora abbiamo un altro 1
spazio, ma non abbastanza per saltare, quindi aggiungiamo la cella corrente e un 1
(in questo caso 11
)
01011111
^
010011
Siamo alla fine, quindi aggiungiamo un singolo 1
e terminiamo questa generazione
01011111
^
0100111
Compito
Dato input in qualsiasi formato ragionevole è necessario creare una funzione o un programma che calcola una generazione dell'automa.
Questa è una domanda di code-golf, quindi le risposte verranno classificate in byte, con un numero inferiore di byte migliori.
Implementazione di esempio
Ecco un'implementazione di esempio in Haskell (definisce una funzione d
, ma il programma stampa le iterazioni indefinitamente):
d('1':_:_:x) = "0" ++ d x
d(a:x) = a:'1':d x
d x = "1"
r x = x:map d(r x)
10
dovrebbe stampare 11011
? Penso che alcuni altri casi di test sarebbero utili