Einführung
Gijswijts Sequenz ( A090822 ) ist wirklich berühmt, WIRKLICH langsam. Um zu veranschaulichen:
- Die ersten 3 erscheinen im 9. Semester (in Ordnung).
- Die ersten 4 erscheinen im 220. Semester (weit weg, aber machbar).
- Die ersten 5 erscheinen (ungefähr) am 10 ^ (10 ^ 23) -ten Term (nur nein).
- Niemand weiß wirklich, wo die ersten 6 sind ... es wird vermutet, dass es an der ...
2 ^ (2 ^ (3 ^ (4 ^ 5))).
Sie können davon ausgehen, dass Sie sich nicht mit einer zweistelligen Zahl auseinandersetzen müssen.
Die Sequenz wird wie folgt generiert:
- Der erste Term ist 1.
- Jeder Ausdruck danach gibt die Anzahl der "Blöcke" an, die zuvor wiederholt wurden (wenn mehrere "Blöcke" wiederholt wurden, wird die größte Anzahl der wiederholten Blöcke verwendet).
Zur Verdeutlichung hier die ersten Begriffe.
1 -> 1, 1
(ein Wiederholungsblock ( 1
), also die aufgezeichnete Ziffer ist 1
)
1, 1 -> 1, 1, 2
(zwei Wiederholungsblöcke ( 1
), also die aufgezeichnete Ziffer ist 2
)
1, 1, 2 -> 1, 1, 2, 1
(ein Wiederholungsblock ( 2
oder 1, 1, 2
), also die aufgezeichnete Ziffer ist 1
)
1, 1, 2, 1 -> 1, 1, 2, 1, 1
(Du hast die Idee)
1, 1, 2, 1, 1 -> 1, 1, 2, 1, 1, 2
1, 1, 2, 1, 1, 2 -> 1, 1, 2, 1, 1, 2, 2
(zwei Wiederholungsblöcke ( 1, 1, 2
), also die aufgezeichnete Ziffer ist 2
)
Aufgabe
Ihre Aufgabe ist es, wie in der Frage angegeben, n Ziffern der Gijswijt-Sequenz zu generieren.
Anleitung
- Die Eingabe ist eine Ganzzahl
n
. - Ihr Code kann die Ziffern in beliebiger Form ausgeben (eine Liste, mehrere Ausgaben usw.).
Dies ist Code Golf, also gewinnt der kürzeste Code in Bytes.
._
Funktion und andere nützliche Funktionen in Pyth.CJam,
33313027 BytesVielen Dank an Peter Taylor für das Speichern von 1 Byte.
Teste es hier.
Erläuterung
quelle
CJam (
30 29 2724 Bytes)Online-Demo
Dies ist eine sehr gemeinsame Anstrengung mit Martin.
e`
) zum Identifizieren von Wiederholungen ist die von MartinW$
zur Vereinfachung der Stapelverwaltung$W>+
speziellen Hülle eliminiert , wie in der folgenden Sektion erläutertMein erster 30-Byte-Ansatz:
Online-Demo
Präparation
quelle
Haskell, 97 Bytes
Die dritte Zeile definiert eine anonyme Funktion, die eine Ganzzahl annimmt und eine Liste von Ganzzahlen zurückgibt. Sehen Sie es in Aktion.
Erläuterung
Die Hilfsfunktion erstellt
f
die Sequenz in umgekehrter Reihenfolge, indem sie rekursiv überprüft, ob die vorherige Sequenz mit einem wiederholten Block beginnt.k
ist die Anzahl der Wiederholungen undp
die Länge des Blocks.quelle
Pyth,
4138 BytesProbieren Sie es online!
quelle
Retina ,
6660 BytesDie Eingabe ist eine unäre Ganzzahl, die verwendet wird
!
als Ziffer verwendet wird (obwohl dies in ein anderes nicht numerisches Zeichen geändert werden kann). Die Ausgabe ist einfach eine Folge von Ziffern.Probieren Sie es online! (Alternativ dazu finden Sie hier eine Version, die dezimale Eingaben akzeptiert. )
Für Testzwecke kann dies beschleunigt werden , bis eine Menge mit einer geringen Modifikation, die von Eingang Tests ermöglicht 220 in weniger als eine Minute:
Probieren Sie es online! ( Dezimalversion. )
Wenn Sie noch größere Zahlen testen möchten, geben Sie am besten einfach eine massive Eingabe ein und setzen Sie ein
:
nach dem Anfangsbuchstaben+
. Dies veranlasst Retina, die aktuelle Sequenz jedes Mal zu drucken, wenn die Berechnung einer neuen Ziffer abgeschlossen ist (mit allen Ziffern nacheinander).Erläuterung
Die Lösung besteht aus einer einzelnen Regex-Ersetzung, die wiederholt auf die Eingabe angewendet wird, bis sich das Ergebnis nicht mehr ändert. In diesem Fall stimmt die Regex nicht mehr überein. Das
+
am Anfang führt diese Schleife ein. Das1
ist eine Grenze , die sagt Retina nur das erste Spiel ersetzen (das zur ersten Iteration nur relevant ist). In jeder Iteration ersetzt die Stufe eine!
(von links) durch die nächste Ziffer der Sequenz.Wenn Sie eine Grundierung für Bilanzkreise benötigen, verweise ich Sie wie gewohnt auf meine SO-Antwort .
Hier ist eine kommentierte Version des regulären Ausdrucks. Beachten Sie, dass das Ziel darin besteht, die maximale Anzahl wiederholter Blöcke in einer Gruppe zu erfassen
1
.Nachdem dies alles erledigt ist, schreiben wir zurück
$1
(und löschen damit die!
) sowie die Anzahl der Captures in der Gruppe, mit$#1
denen die maximale Anzahl der Wiederholungen übereinstimmt.quelle
Ruby, 84 Bytes
Die Retina-Antwort hat mich dazu inspiriert, eine auf Regex basierende Lösung zu entwickeln, um die beste Sequenz zu finden, anstatt Sequenzen in einem Array zu zählen, aber mit weniger Genialität (negative Lookbehinds mit Quantifizierern scheinen in Ruby nicht erlaubt zu sein, daher bezweifle ich Ich könnte Retinas Antwort sowieso direkt portieren.)
Bei einer bereits generierten Sequenz
s
werden allei
von1
bis zugeordnets.length
(n
wurde in diesem Fall zum Speichern von Bytes verwendetn>=s.length
). Anschließend wird diese Regex verwendet, um die Anzahl der Wiederholungen einer Teilsequenz mit der Länge zu berechneni
:Wenn eine Übereinstimmung mit dieser Länge gefunden wird, berechnet sie die Anzahl der Wiederholungen, indem die Länge der angegebenen Übereinstimmung
$&
durchi
die Länge der Teilsequenz dividiert wird . Wenn keine Übereinstimmung gefunden wurde, wird es als behandelt1
. Die Funktion ermittelt dann die maximale Anzahl von Wiederholungen aus dieser Zuordnung und fügt diese Anzahl am Ende der Zeichenfolge hinzu.quelle