Dies ist eine Neuauflage einer alten Herausforderung , um die E / A-Anforderungen an unsere aktuellen Standards anzupassen. Dies geschieht, um mehr Sprachen die Teilnahme an einer Herausforderung zu dieser beliebten Sequenz zu ermöglichen. In diesem Meta-Post finden Sie eine Diskussion zum Repost.
Die Kolakoski-Sequenz ist eine unterhaltsame selbstreferenzielle Sequenz, die die Ehre hat, die OEIS-Sequenz A000002 zu sein (und die viel einfacher zu verstehen und zu implementieren ist als A000001). Die Sequenz beginnt mit 1 , besteht nur aus 1 s und 2 s und das Sequenzelement a (n) beschreibt die Länge des n- ten Laufs von 1 s oder 2 s in der Sequenz. Dies definiert eindeutig die Reihenfolge (mit einer Visualisierung der Läufe darunter):
1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1,2,1,1,2,1,2,2,1,1,2,1,1,2,...
= === === = = === = === === = === === = = === = = === === = === =
1, 2, 2, 1,1, 2, 1, 2, 2, 1, 2, 2, 1,1, 2, 1,1, 2, 2, 1, 2, 1,...
Ihre Aufgabe ist es natürlich, diesen Ablauf umzusetzen. Sie können dazu eines von drei Formaten auswählen:
- Nehmen Sie eine Eingabe n und geben Sie den n- ten Term der Sequenz aus, wobei n entweder bei 0 oder 1 beginnt .
- Nehmen Sie eine Eingabe n und geben Sie die Terme bis einschließlich des n- ten Terms der Sequenz aus, wobei n entweder mit 0 oder 1 beginnt (dh entweder die ersten n oder die ersten n + 1 Terme ausgeben ).
- Ausgabewerte aus der Sequenz auf unbestimmte Zeit.
Im zweiten und dritten Fall können Sie jedes vernünftige, eindeutige Listenformat auswählen. Es ist in Ordnung, wenn es kein Trennzeichen zwischen den Elementen gibt, da sie per Definition immer eine einzelne Ziffer sind.
Im dritten Fall können Sie, wenn es sich bei Ihrer Einreichung um eine Funktion handelt, auch eine unendliche Liste oder einen Generator in Sprachen zurückgeben, die diese unterstützen.
Sie können ein Programm oder eine Funktion schreiben und eine unserer Standardmethoden zum Empfangen und Bereitstellen von Eingaben verwenden. Beachten Sie, dass diese Lücken standardmäßig verboten sind.
Das ist Code-Golf , also gewinnt die kürzeste gültige Antwort - gemessen in Bytes .
Antworten:
Gelee , 7 Bytes
Dies ist ein vollständiges Programm, das die ersten n Terme ausgibt.
Probieren Sie es online!
Wie es funktioniert
Beispiellauf
Sei n = 5 .
Der erste Aufruf der Ketten Wiederholungen 1, 2 zyklisch Länge zu erreichen , 5 , dann jedes Element 5 mal, und kürzt schließlich das Ergebnis zu Länge 5 .
Dies ergibt eine Liste der Länge 5 . Das erste Element ist das erste Element der Kolakoski-Sequenz.
Der zweite Aufruf der Kette wiederholt 1, 2 zyklisch, um die Länge 5 zu erreichen , und wiederholt dann das k- te Element j- mal, wobei j das k- te Element der vorherigen Liste ist, und schneidet schließlich das Ergebnis auf die Länge 5 ab .
Dies ergibt eine weitere Liste der Länge 5 . Die ersten beiden Elemente sind die ersten beiden Elemente der Kolakoski-Sequenz.
Der Prozess wird für drei weitere Iterationen fortgesetzt.
Dies sind die ersten fünf Elemente der Kolakoski-Sequenz.
quelle
Python 2 , 51 Bytes
Druckt auf unbestimmte Zeit. Erstellt die Liste,
l
während sie durchlaufen wird. Hängt für jeden Eintragx
von Kopien von oder an , je nachdem, was sich gegenüber dem aktuell letzten Element befindet.l
x
1
2
Die Hauptschwierigkeit liegt im Umgang mit dem anfänglichen selbstreferenziellen Fragment
[1,2,2]
. Dieser Code druckt nur die Initiale1,2
und fährt von dort fort. Der zusätzliche Druck kostet 12 Bytes. Ohne das:39 Bytes , die ersten beiden Einträge fehlen:
Ein weiterer Ansatz besteht darin, die ersten beiden Einträge speziell zu initialisieren. Wir initialisieren
l
als,[0,0,2]
damit die ersten beiden Einträge nicht zum Anhängen führen, sondernprint x or n
als gedruckt werdenn
.51 Bytes
Eine weitere Korrektur besteht darin
l=[1]
, den Wechsel manuell zu initialisieren , zu verfolgenn
und den Druckvorgang zu korrigieren:51 Bytes
Ohne das
(l==[1,1])+
funktioniert alles, außer die gedruckten Sequenzen starten1,1,2
statt1,2,2
. Es muss einen besseren Weg geben, um zu erkennen, dass wir uns in diesem zweiten Schritt befinden.Und noch ein seltsamer Fix, auch irgendwie die selbe Byteanzahl:
51 Bytes
quelle
Wumpus ,
1311 BytesProbieren Sie es online!
Druckt die Sequenz unbegrenzt ohne Trennzeichen.
Ich bin wirklich überrascht, wie kurz das ist.
Erläuterung
Die Grundidee ist, die Sequenz auf dem Stapel zu belassen und das unterste Element wiederholt zu verwenden, um einen weiteren Lauf zu generieren und ihn dann zu drucken. Wir missbrauchen den Stack hier effektiv als Warteschlange. Wir können auch ein paar Bytes sparen, indem wir arbeiten
0
und1
(nur für die Ausgabe inkrementieren) anstelle von1
und2
, da wir auf diese Weise den Stapel nicht explizit mit einem initialisieren müssen1
und die logische Negation verwenden können, um zwischen den beiden Werten umzuschalten.quelle
Brachylog ,
30 26 25 23 17 1614 BytesGibt die ersten n Werte aus. Verwendet die "Ausgangsvariable"
.
für die Eingabe und gibt sie an die "Eingangsvariable" aus?
. Probieren Sie es online!Erläuterung
Ich bin ziemlich zufrieden damit, wie aussagekräftig dies war: Das Programm ist im Grunde eine allgemeine Beschreibung der Ausgabeliste und ihrer Beziehung zur Eingabe.
Da
{1|2}ᵐ
Listen in lexikografischer Reihenfolge ausprobiert werden, beginnt die Ausgabe mit 1.quelle
Schale , 10 Bytes
Gibt die ersten n Werte zurück. Probieren Sie es online!
Erläuterung
Für Eingabe 20 sieht der Vorgang folgendermaßen aus:
quelle
Java 10,
15510810510097 BytesDruckt unbegrenzt ohne Begrenzer.
-3 Bytes nach einem indirekten Hinweis von @Neil .
-5 Bytes dank @MartinEnder .
-3 Bytes für die Konvertierung von Java 8 nach Java 10.
Erläuterung:
Probieren Sie es online aus (Timeout nach 60 Sekunden bei TIO).
quelle
[1,2,2]
und von dort aus) und ich schrieb die 155-Byte-Antwort (die jetzt mit einem String gespielt wird) statt Liste).(3-i)
statt verwenden(1+i%2)
?i
nicht 1 oder 2, sondern der String-Index.Gelee , 10 Bytes
Gibt den n- ten Term zurück.
Probieren Sie es online!
Wie es funktioniert
quelle
Haskell , 33 Bytes
Probieren Sie es online!
Ørjan Johansen sparte 7 Bytes mit einem unwiderlegbaren Muster, um das Präfix zu erzwingen.
quelle
n:
am Anfang des Ausdrucks verwenden, müssen Sie nicht wissenx
, dass der erste Ausdruck erzeugt werden solln
. Das Muster muss jedoch faul sein, um zu vermeiden, dass die Funktion es überprüft, bevor Sie zum Menü wechselnn:
.Gol> <> ,
87 BytesProbieren Sie es online!
Erläuterung
Dies ist ein Port meiner Wumpus-Antwort . Gol> <> ist im Grunde die Sprache, die über alle notwendigen Funktionen verfügt, um die Wumpus-Antwort zu portieren (insbesondere implizite Nullen am Ende des Stapels, "duplizieren" implementiertes "pop, push, push" und einen Stapelrotationsbefehl), aber :
00.
zum Anfang zurückspringen müssen.K
, das heißt "pop N, dann dupliziere das nächste Element N-mal", das ersetzt werden kann?=
und ein weiteres Byte speichert.Das Mapping von Wumpus nach Gol> <> lautet also:
quelle
Shakespeare Programming Language ,
594 583572 BytesVielen Dank an Ed Wynn für -10 Bytes!
Probieren Sie es online!
Dies ist eine Golf-Version von Ed Wynns ungolfed Lösung , ausgehend von der 828-Byte-Lösung, die er in den Kommentaren verlinkt hat und die ein wenig verrückt macht.
Erläuterung:
quelle
> <> ,
1312 BytesProbieren Sie es online!
Ein Hafen von Martin Enders Wumpus-Antwort . Leider
><>
gibt es weder einen Inkrement- oder Invertierungsbefehl noch implizite Nullen am unteren Ende des Stapels, sodass dieser Vorgang etwas länger dauert.quelle
JavaScript,
67666058525150 BytesNun, das hat mein Gehirn mehr jucken lassen, als es sollte! Führt den dritten
n
Term mit dem Index 0 erneut aus.5 + 1 Bytes gespart dank tsh kratzt mein juckendes Gehirn!
Probier es aus
Das folgende Snippet gibt die ersten 50 Terme aus.
Code-Snippet anzeigen
Erläuterung
Dies ist eine der seltenen Situationen, in denen wir einige Variablen außerhalb des Funktionsbereichs deklarieren, sie innerhalb der Funktion ändern und sie bei nachfolgenden Aufrufen der Funktion immer noch wiederverwenden können.
quelle
n=>(g=s=>s[n]||g(s+(++x%2+1)*(10*s[x]-9)))('122',x=1)
s='122',x=1,g=n=>s[n]||g(n,s+=(++x%2+1)*(10*s[x]-9))
als gültige Vorlage?s[n]||
war ein klarer Fall, den Wald vor lauter Bäumen nicht zu sehen! Ihr zweiter Vorschlag ist jedoch nicht gültig, da die Funktion nur einmal aufgerufen werden kann.s
&x
müssen bei jedem Aufruf initialisiert werden.s
undx
nicht von anderen Codes zwischen je Invokes (die Standardeinstellung) berührt.s[x]+0-9
ist ein ziemlich ordentlicher TrickPython (2 und 3),
65 bis60 BytesGibt den n- ten Eintrag mit dem Index 0 zurück.
Alternative (65 Bytes):
quelle
[1,2,2]
als Startwert densum
Haskell , 48 Bytes
-1 byte dank nimi. -2 Bytes dank Lynn.
Probieren Sie es online!
Wiederhole jedes Element seiner Position mod 2 + 1 mal.
quelle
c=1:2:c
Brainfuck , 61 Bytes
Probieren Sie es online!
Druckt Zahlen auf unbestimmte Zeit als Zeichencodes. Aus Gründen der Übersichtlichkeit wird hier eine Version in Zahlen gedruckt (mit Ausnahme der ersten beiden Elemente, die leicht zu überprüfen sind).
Wie es funktioniert:
quelle
05AB1E ,
129 Bytes3 Bytes dank Grimy gespart
Druckt die ersten n Elemente.
Probieren Sie es online!
Erläuterung
quelle
2L[2LÞsÅΓ
.∞[2LÞsÅΓ
.Δ2LÞsÅΓI∍
für eine Version, die die ersten n Elemente bei Eingabe von n druckt.05AB1E , 15 Bytes
Probieren Sie es online! oder mit einem Iterationslimit
Erläuterung
quelle
¸«
,=
würde sie für 2 Bytes gespeichert drucken.ƵLS[NÌ©èF®É>=
, keine Notwendigkeit zu täuschen, wenn Sie nicht verbrauchen.Python 3 ,
5554 BytesProbieren Sie es online!
quelle
J , 12 Bytes
Funktion mit einem Argument, die n nimmt und die ersten n Terme erzeugt. Probieren Sie es online!
Ich möchte nur meine alte Antwort auf die alte Frage erläutern .
I.
ist ein Verb, das ein Array von Zahlen aufnimmt und eine Liste von Indizes ausspuckt. Wenn also das k- te Element im Array n ist , erscheint der Index k n- mal. Wir werden es verwenden, um die Kolakowski-Sequenz von einem Anfangssamen hochzufahren. Jeder Schritt wird wie folgt ausgeführt:Wenn wir diese Operation (
1+2|I.
) ab 10 immer wieder ausführen , sieht das ungefähr so aus:Beachten Sie, wie wir jedes Mal mehr und mehr korrekte Ausdrücke erhalten und nach einer Weile die ersten n Ausdrücke festgelegt werden. Die Anzahl der Iterationen, die erforderlich sind, um sich zu beruhigen, ist schwer genau zu beschreiben, aber es scheint in n grob logarithmisch zu sein. Wenn wir es also n- mal ausführen (
^:]
), sollte es in Ordnung sein. (Weitere Informationen finden Sie in diesen anderen OEIS-Sequenzen: Generierungslängen , Teilsummen .)Sobald wir damit fertig sind, müssen wir nur noch die ersten n Terme verwenden
$
. Die Konstruktion$v
für jedes Verbv
ist ein Beispiel für einen Hook, undn
wenn Sie es als Argument angeben, wird sie ausgeführtn $ (v n)
.Hier ist die alte 13-Bit - Version , die weit weniger Verschwendung von Zeit und Raum ist:
($1+2|I.)^:_~
. Die Eingabe wird bei jedem Schritt abgeschnitten, sodass genau so oft ausgeführt werden kann, wie zum Einschwingen erforderlich, und nicht mehr linear.quelle
I.
. Ich wollte schon immer die Kopierfunktion sehen, die in einigen Golfspielen verwendet wird.Fueue , 30 Bytes
Fueue ist ein warteschlangenbasierter Esolang, bei dem sich das laufende Programm und seine Daten in derselben Warteschlange befinden, die Ausführung die Warteschlange zyklisch durchläuft und die Programmierung viel Synchronisation erfordert, um zu verhindern, dass etwas zur falschen Zeit ausgeführt wird.
Probieren Sie es online!
Das obige druckt eine endlose Liste von Ziffern als Steuercodes. Für 34 Bytes können tatsächliche Ziffern ausgegeben werden:
Probieren Sie es online!
Der Rest der Erklärung verwendet die letztere Version.
Zusammenfassung der Fueue-Elemente
Die Warteschlange Fueue kann die folgenden Elemente enthalten:
)
Funktion sie nicht entsperrt , und~
(zwei folgende Elemente tauschen),:
(nächstes Element duplizieren) und)
(folgenden Block deblockieren).Übersicht auf hoher Ebene
Während der Hauptschleife des Programms besteht die Warteschlange aus:
[49]
und[50:]
bezeichnet.Low-Level-Trace der ersten 10 Befehle
Exemplarische Vorgehensweise einer vollständigen Iteration der Hauptschleife
Optionales Leerzeichen wurde eingefügt, um Befehle zu trennen.
Zyklus 1:
49
druckt1
.)
ist inaktiv und wartet darauf, mit dem Hauptschleifenblock zusammengeführt zu werden.50
druckt2
.:
dupliziert den Hauptschleifenblock (der eine Kopie für die Selbstreplikation benötigt.)Zyklus 2:
)
Deblockiert den ersten Hauptschleifenblock, sodass er mit der Ausführung des nächsten Zyklus beginnt.Zyklus 3: Stellt
[50:]
die erste in der Kette erzeugte Ziffer dar, die2
noch nicht entsperrt ist. Das Folgende)
wird dies schließlich tun, nachdem der Rest der Hauptschleife ihn durchlaufen hat.~)~:~
ist eine golfene (mit einem Swap und einer Kopie) Verzögerung von einem Zyklus~)~~
.[[49]:~))~:~~]
ist inaktiv.~
tauscht den folgenden Hauptschleifenblock hinter den[50:]
Ziffernblock.Zyklus 4:
)
wartet noch,~)~
produziert~)
,~
springt[[49]:~))~:~~]
über den[50:]
Ziffernblock hinaus.Zyklus 5:
~
Wechselt)
über den[50:]
Ziffernblock hinaus.Zyklus 6: Der erste
)
entsperrt jetzt den Ziffernblock[50:]
, der nächste)
entsperrt das Unterprogramm[[49]:~))~:~~]
.Zyklus 7:
50
druckt2
,:
dupliziert den gerade erzeugten[49]
Ziffernblock und erzeugt einen Lauf von zwei1
Sekunden.:~))~:~
ist eine Verzögerung von einem Zyklus von~~))~:
.~
tauscht den verbleibenden Hauptschleifenblock nach dem ersten aus[49]
.Zyklus 8:
~~))
ist eine Verzögerung von einem Zyklus)~)
.~
Swaps:
vorbei an der aktuell durchquerten[49]
.Zyklus 9:
~
tauscht)
vorbei[49]
.:
dupliziert den Hauptschleifenblock.Zyklus 10: Der erste
)
löst die[49]
Sperrung des gerade durchlaufenen Ziffernblocks , der zweite)
startet die Hauptschleife neu, um den nächsten zu durchlaufen (oben am Anfang der Warteschlange gezeigt).quelle
x86,
4137353328 BytesIch hatte viel Spaß beim Herumspielen mit verschiedenen x86-Anweisungen, da dies meine erste "nicht triviale" x86-Antwort ist. Ich habe zuerst x86-64 gelernt und viele Bytes gespart, indem ich mein Programm auf 32-Bit konvertiert habe.
Es stellt sich heraus, dass der von OEIS verwendete Algorithmus Werte in ein Array überträgt, wodurch es für x86 zugänglich ist und Werte auf dem Stapel gespeichert werden können (beachten Sie, dass MIPS keine Stapelanweisungen hat).
Derzeit nimmt das Programm
N
Werte als Eingabe inecx
und gibt eine Adresse inebp
einem Array zurück, wobei das n-te Element den n-ten Wert in der Sequenz darstellt. Ich gehe davon aus, dass die Rückgabe auf dem Stack und die Berechnung zusätzlicher Werte gültig ist (wir betrachten das, was sich hinter dem Array befindet, sowieso als Müll).Änderungsprotokoll
-4 Bytes durch Berechnen
x = 2 - n%2
mitxor
jeder Iteration-2 Bytes mit do-while statt while-Schleife.
-2 Bytes durch Drücken der Anfangswerte 1, 2, 2 mit
eax
-5 - Bytes von nicht speichert
n
explizit und stattdessenN
SchleifenlaufzeitenObjektspeicherauszug:
quelle
C (gcc) ,
7271656462 Bytes-9 Bytes dank @ceilingcat
Probieren Sie es online!
Generiert Werte der Sequenz auf unbestimmte Zeit (Option 3 aus der Challenge)
quelle
for($x=$y=-1;;$y=$y+1|$f&.5*$x^=$f=$y&-$y-2)echo$x&1?:2;
. 2)50-x%2
sollte ein Byte für Sie speichern. 3) Ich habe versucht, es zum Laufen zu bringenx=y=1
; konnte aber noch nicht richtig operieren. Können Sie?Perl 5 , 36 Bytes
Noch eine triviale Modifikation der klassischen TPR (0,3) -Lösung:
Gibt die Serie von
0
bis ausn
Probieren Sie es online!
quelle
Javascript ES6 -
717068 Bytes1 Bit gespart dank Neil
Danke an Shaggy für die Korrektur meines Fehlers, auch für das Speichern von 1 Bit.
quelle
x=0
stattx=1
), aber @Shaggy ist in der Tat richtig: Dies funktioniert nicht in der aktuellen Form (ich habe das,i=100;i-->0
temporäre hinzugefügt, um nur die ersten 100 Elemente zu sehen, anstatt es zu müssen) Warten Sie 60 Sekunden, bevor Sie eine Ausgabe sehen. Keine Ahnung, warum es nicht funktioniert. JS ist nicht mein Ding.1.
Initiierenx
auf 0 anstelle von 1 (wie @KevinCruijssen erwähnt) und2.
Überprüfen, ob dasx
th Zeichen in der Zeichenfolge, das immer nur 1 oder 2 sein kann, größer als 49 ist.(_[x]*10-9)
als(_[x]>1?11:1)
Appleseed , 89 Bytes
Definiert eine Funktion
K
, die keine Argumente akzeptiert und die Kolakoski-Sequenz als unendliche Liste zurückgibt. Probieren Sie es online!Dieser Ansatz wurde durch die Haskell-Antwort von Totalhuman inspiriert . Mein ursprünglicher Ansatz war länger und war wahrscheinlich O (2 ^ n). : ^ P
Ungolfed
Die Retourenliste beginnt mit
(1 2)
. Danach, um den Rest zu generieren (von innen nach außen lesen):(kolakoski)
auf, um die Kolakoski-Sequenzliste abzurufen (aufgrund der verzögerten Auswertung spielt es keine Rolle, dass die Liste noch nicht vollständig generiert wurde).(cycle (list 1 2))
Erstellt eine unendliche Liste(1 2 1 2 1 2 ...)
repeat-val
. Dies wiederholt das1
oder2
aus dercycle
Liste entweder ein- oder zweimal, abhängig vom zugeordneten Wert in der Kolakoski-Liste. Ergebnis:((1) (2 2) (1 1) ...)
flatten
diese Liste in(1 2 2 1 1 ...)
(concat (list 1 2)
, alsodrop
die ersten beiden aus der generierten Liste, um Doppelungen zu vermeiden.quelle
Stax , 12 Bytes
Führen Sie es aus und debuggen Sie es
Dies ist die ASCII-Darstellung desselben Programms.
Die Sequenz wird x-mal erweitert, wobei x die Eingabe ist. Dann gibt es das x- te Element mit dem Index 0 aus.
Hier ist eine 12-Byte-Bonuslösung, die die Ausgabe als unendlichen Stream erzeugt. Drücken Sie Run, um zu starten.
quelle
R, 63 Bytes oder 61 Bytes
Implementierung 1: druckt den n- ten Term der Sequenz aus.
Implementierung 2: druckt die ersten n Terme der Sequenz aus.
(Der Unterschied ist nur in der letzten Zeile.)
Ja, ja, Sie können sich beschweren, dass meine Lösung ineffizient ist, wirklich mehr Begriffe berechnet als benötigt, aber dennoch ...
Update: Danke an @Giuseppe für das Abschneiden von 9 Bytes.
quelle
a=c(a,rep(2-n%%2,a[n]))
anstelle der zweitenfor
Schleife, um einige Bytes zu entfernen.Shakespeare Programming Language, 575 Bytes (aber fehlerhaft) oder 653 oder 623 Bytes
In der heiß umkämpften SPL-Kategorie würde dies Jo Kings aktuellen Eintrag (583 Byte) übertreffen, mit der Ausnahme, dass er fehlerhaft ist: Erstens läuft er nicht in der TIO-Version (Implementierung der SPL-Website), sondern in Perl Version , also vielleicht ist das kein schwerwiegender Defekt. Zweitens werden die ersten beiden Ziffern nicht gedruckt. Wenn wir diesen Fehler in Jo Kings Lösung zulassen würden, wäre diese fehlerhafte Lösung 553 Byte groß und würde meine fehlerhafte Lösung übertreffen.
Meine Lösung schlägt bei TIO aus zwei Gründen fehl: Wir versuchen, einen leeren Stack zu verwenden, der beim Auftauchen Null zurückgibt. und wir kommen zur ersten Szene mit "[Enter Ford and Puck]", obwohl niemand die Bühne verlassen hat. Dies sind lediglich Warnungen in der Perl-Version. Wenn ich diese Fehler behebe und die ersten beiden Ziffern eingebe, erreiche ich 653 Bytes:
Probieren Sie es online!
Ich kann die vollständige Sequenz in der Perl-Implementierung mit 623 Bytes generieren:
Ich möchte jedoch darauf hinweisen, dass diese Lösung im Vergleich zu vielen anderen Lösungen schnell ist und logarithmische Speichermengen verwendet, anstatt die gesamte Liste zu speichern. (Dies ähnelt der C-Lösung von vazt, mit der es in weiter Ferne verwandt ist.) Dies macht keinen Unterschied für den Golfsport, aber ich bin trotzdem zufrieden damit. In Perl können Sie in etwa einer Minute eine Million Stellen erzeugen (z. B., wenn Sie zu sed und wc wechseln, um eine Stellenzählung zu erhalten), wobei die andere Lösung möglicherweise einige tausend Stellen ergibt.
Erläuterung
Wir speichern eine Folge von Variablen in der Reihenfolge: Pucks Stapel (von unten nach oben), Pucks Wert, Ford Wert, Ford Stapel (von oben nach unten). Abgesehen von den Nullwerten an den Enden (mit der Null links, möglicherweise aus dem Poppen eines leeren Stapels), ist jeder Wert die Ziffer, die bei dieser Generation als nächstes generiert wird, wobei 2 hinzugefügt wird, wenn die nächste Generation ein anderes Kind von diesem Elternteil haben muss. Wenn die Sequenz N Nicht-Null-Werte enthält, werden alle untergeordneten Elemente bis einschließlich der N-ten Generation in einer Art Tiefen-Erst-Baumdurchquerung generiert. Wir drucken nur Werte der N-ten Generation. Wenn die N-te Generation vollständig generiert wurde, sind die gespeicherten Werte tatsächlich die Startwerte für die Generationen 2 bis (N + 1), daher fügen wir links eine 2 hinzu und beginnen erneut, wobei wir diesmal die (N + 1) generieren ) -te Generation.
Also ein Überblick: Szene X: Wenn wir hier ankommen, ist dies der Beginn einer neuen Durchquerung. Puck == 0. Wir legen diese Null optional auf Pucks Stapel und setzen Puck = 2. Szene L: Wenn Ford == 0 ist, haben wir die Druckgeneration erreicht. Wenn nicht, gehe zu V. Zum Drucken, wenn der Wert in Puck 2 addiert hat, entferne die 2 und drucke sie zweimal; Wenn nicht, drucken Sie es einmal aus. Szene M: Dies ist eine Schleife, in der wir den Wert von Puck wiederholt umschalten und durch die Sequenz zurückgehen. Wir wiederholen, bis entweder wir das Ende erreichen (Puck == 0), in diesem Fall gehen wir zu X, oder wir erreichen einen Wert, der ein anderes Kind benötigt (Puck> 2), in diesem Fall subtrahieren wir die zusätzlichen 2 und gehen in V. Szene vorwärts V: Hier gehen wir vorwärts. Wenn Puck 2 oder 4 ist, enthält die nächste Generation zwei Kinder vom aktuellen Elternteil, also Ford + = 2. Schritt vorwärts durch die Sequenz. Gehe zu L, um die Beendigung zu überprüfen.
quelle
Axo , 13 Bytes
Probieren Sie es online!
Erläuterung
Dies begann als Port einer alternativen Lösung in meiner Wumpus-Antwort :
Dies ergab 18 Bytes. Am Ende habe ich es auf die 13 Bytes herunter gespielt, die Sie oben sehen, um es besser an die Funktionsweise von Axo anzupassen. Diese 13-Byte-Version inspirierte dann die Verbesserung auf 11 Byte in Wumpus. Jetzt ist sie tatsächlich näher an dieser Version.
Wie bei Wumpus enthält auch bei Iteration i der untere Teil des Stapels ein (i) -1 und der obere Teil das erste Element des i- ten Durchlaufs, aber wir arbeiten durchgehend mit 0 und 1 , außer beim Drucken.
quelle
Ruby ,
4539 Bytesdruckt auf unbestimmte Zeit
Probieren Sie es online!
Probieren Sie es mit einer überladenen Druckfunktion aus, mit der Sie ein Trennzeichen und die Anzahl der gedruckten Elemente auswählen können
quelle