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 1
gefolgt von 2
anderen Werten stößt , wird ein a 0
an 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 1
und das Lesen fortgesetzt. Am Ende der Zeichenfolge wird eine einzelne 1
an das Ergebnis angehängt .
Hier ist ein ausgearbeitetes Beispiel einer Generation
01011111
^
Wir begegnen zuerst einem, 0
also hängen wir 01
an unser Ergebnis
01011111
^
01
Jetzt begegnen wir einer, 1
also fügen wir eine Null hinzu und überspringen die nächsten beiden Werte
01011111
^
010
Wir begegnen einem anderen, 1
also tun wir dasselbe
01011111
^
0100
Wir haben jetzt einen anderen, 1
aber 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 1
und 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