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 1seguito da 2altri valori aggiungerà 0a al risultato e continuerà a leggere. Se rileva un 0(o sono rimasti meno di 3 valori), aggiungerà il valore corrente e un 1e continuerà a leggere. Alla fine della stringa, verrà aggiunto un singolo 1al risultato.
Ecco un esempio elaborato di una generazione
01011111
^
In primo luogo incontriamo un 0così aggiungiamo 01al nostro risultato
01011111
^
01
Ora incontriamo un 1così aggiungiamo uno zero e saltiamo i prossimi due valori
01011111
^
010
1Ne incontriamo un altro, quindi facciamo lo stesso
01011111
^
0100
Ora abbiamo un altro 1spazio, 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 1e 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)
10dovrebbe stampare 11011? Penso che alcuni altri casi di test sarebbero utili