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)
quelle
10
, sollte sie gedruckt werden11011
? Ich denke, ein paar weitere Testfälle wären hilfreichAntworten:
V ,
262221 BytesVielen Dank an @CowsQuack für 4 Bytes durch die Kombination von Regexen! Und @ ØrjanJohansen für ein weiteres Byte mit einigen Regex-Kombinationen.
Probieren Sie es online aus!
Verwendet den Ersatz mehrmals und fügt am Ende eine 1 hinzu. Nichts Besonderes. Ich habe eine Version, die neu zugeordnet
1
und0
im Einfügemodus ist, um den gewünschten Effekt zu erzielen, aber sie ist ziemlich viel länger.(Mehrfachersatzversion: Probieren Sie es online aus! )
quelle
Ó1ü0/&1
(ü
is\|
)Ó./&1
gefolgt vonÓ31/0
.JavaScript (ES6), 56 Byte
Nimmt die Eingabe als Array von Zeichen auf. Gibt eine Zeichenfolge oder die Zahl zurück,
1
wenn ein leeres Array angegeben ist.Demo
Code-Snippet anzeigen
Animierte Version
Beispiele für stabile Eingänge: 0101, 010011111
Code-Snippet anzeigen
quelle
Python 2 , 88 Bytes
Probieren Sie es online aus!
quelle
Python 2 , 89 Bytes
Probieren Sie es online aus!
-4 Bytes dank Rod
-6 Bytes dank OVs
-1 Bytes dank Micsthepick
quelle
[0]if v else[x[y],1]
kann umgeschrieben werden als[[x[y],1],[0]][v]
, aber Sie können denv
Wert invertieren , um 96 BytesSwift 3 , 147 Bytes
-1 danke an @ Mr.Xcoder
Ungolfed, gibt den Wert zurück, anstatt zu drucken:
quelle
3<=s.count
mit2<s.count
für -1 Bytes .1
s in der Eingabe mit0 < element
anstattelement == 0
Python 2 , 81 Bytes
Sowohl Eingabe als auch Ausgabe sind Listen (danke an Erik den Outgolfer)
Probieren Sie es online aus!
Manche Fälle
Python 2 , 85 Bytes
Sowohl Eingabe als auch Ausgabe sind Zeichenfolgen (anfängliche Lösung)
Probieren Sie es online aus!
Manche Fälle
Erklärung Es ist einfach ein Golf einer rekursiven Methode.
quelle
1>Z[0]
stattdessen tun0==Z[0]
.Perl 5 , 62 + 2 (
-F
) = 64 BytesProbieren Sie es online aus!
quelle
Scala , 131 + 29 = 160 Bytes
Dies befindet sich in einer Funktion, die die Zeichenfolge
a
als Parameter verwendet und die Ausgabe als Zeichenfolge zurückgibt.Ich muss
import util.control.Breaks._
, also muss ich diese 28 Bytes plus einen nachgestellten Zeilenvorschub hinzufügen.Probieren Sie es online aus!
quelle
C # (.NET Core) , 108 Byte
Probieren Sie es online aus!
Die Eingabe wird als Zeichenfolge verwendet, und eine Zeichenfolge wird als Ausgabe zurückgegeben.
quelle