Bawiłem się automatem komórkowym i znalazłem taki, który miał ciekawe zachowanie. Oto jak to działa:
Odczytuje ciąg binarny od lewej do prawej, jeśli napotka 1
po nim 2
kolejne wartości, dopisze a 0
do wyniku i będzie kontynuował czytanie. Jeśli napotka a 0
(lub pozostały mniej niż 3 wartości), doda aktualną wartość i a 1
i będzie kontynuował czytanie. Na końcu ciągu dołączy 1
wynik do pojedynczego .
Oto wypracowany przykład jednego pokolenia
01011111
^
Najpierw napotykamy 0
tak, więc dołączamy 01
do naszego wyniku
01011111
^
01
Teraz napotykamy a, 1
więc dodajemy zero i pomijamy kolejne dwie wartości
01011111
^
010
Spotykamy innego, 1
więc robimy to samo
01011111
^
0100
Mamy teraz inną, 1
ale niewystarczającą przestrzeń do skoku, więc dołączamy bieżącą komórkę i 1
(w tym przypadku 11
)
01011111
^
010011
Jesteśmy na końcu, więc dołączamy singiel 1
i kończymy tę generację
01011111
^
0100111
Zadanie
Biorąc pod uwagę dane wejściowe w dowolnym rozsądnym formacie, musisz utworzyć funkcję lub program, który oblicza jedną generację automatu.
To jest pytanie w golfa kodu, więc odpowiedzi będą oceniane w bajtach, przy czym mniej bajtów będzie lepszych.
Przykładowa implementacja
Oto przykładowa implementacja w Haskell (definiuje funkcję d
, ale program drukuje iteracje w nieskończoność):
d('1':_:_:x) = "0" ++ d x
d(a:x) = a:'1':d x
d x = "1"
r x = x:map d(r x)
10
to powinien wydrukować 11011
? Myślę, że przydałoby się jeszcze kilka przypadków testowych