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 1po nim 2kolejne wartości, dopisze a 0do wyniku i będzie kontynuował czytanie. Jeśli napotka a 0(lub pozostały mniej niż 3 wartości), doda aktualną wartość i a 1i będzie kontynuował czytanie. Na końcu ciągu dołączy 1wynik do pojedynczego .
Oto wypracowany przykład jednego pokolenia
01011111
^
Najpierw napotykamy 0tak, więc dołączamy 01do naszego wyniku
01011111
^
01
Teraz napotykamy a, 1więc dodajemy zero i pomijamy kolejne dwie wartości
01011111
^
010
Spotykamy innego, 1więc robimy to samo
01011111
^
0100
Mamy teraz inną, 1ale 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 1i 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)
10to powinien wydrukować 11011? Myślę, że przydałoby się jeszcze kilka przypadków testowych