Ich habe mit dem Mobilfunkautomaten herumgespielt und einen gefunden, der ein interessantes Verhalten hatte. So funktioniert das:
Es liest eine Binärzeichenfolge von links nach rechts. Wenn es auf einen Wert 1gefolgt von 2anderen Werten stößt , wird ein a 0an das Ergebnis angehängt und das Lesen fortgesetzt. Wenn es auf a trifft 0(oder weniger als 3 Werte übrig sind), wird der aktuelle Wert und a angehängt 1und das Lesen fortgesetzt. Am Ende der Zeichenfolge wird eine einzelne 1an das Ergebnis angehängt .
Hier ist ein ausgearbeitetes Beispiel einer Generation
01011111
^
Wir begegnen zuerst einem, 0also hängen wir 01an unser Ergebnis
01011111
^
01
Jetzt begegnen wir einer, 1also fügen wir eine Null hinzu und überspringen die nächsten beiden Werte
01011111
^
010
Wir begegnen einem anderen, 1also tun wir dasselbe
01011111
^
0100
Wir haben jetzt einen anderen, 1aber nicht genügend Platz zum Springen, sodass wir die aktuelle Zelle und ein 1(in diesem Fall 11) anhängen.
01011111
^
010011
Wir sind am Ende, also fügen wir eine Single hinzu 1und beenden diese Generation
01011111
^
0100111
Aufgabe
Bei Eingabe in einem vernünftigen Format müssen Sie eine Funktion oder ein Programm erstellen, das eine Generation des Automaten berechnet.
Dies ist eine Code-Golf- Frage, daher werden die Antworten in Bytes bewertet, wobei weniger Bytes besser sind.
Beispielimplementierung
Hier ist eine Beispielimplementierung in Haskell (definiert eine Funktion d, aber das Programm druckt eine Iteration auf unbestimmte Zeit):
d('1':_:_:x) = "0" ++ d x
d(a:x) = a:'1':d x
d x = "1"
r x = x:map d(r x)
10, sollte sie gedruckt werden 11011? Ich denke, ein paar weitere Testfälle wären hilfreich