Ihr Ziel ist es, die streng ansteigende Folge von aufeinanderfolgenden, identischen Stellen von pi (π) auszugeben. Jeder Begriff in der Sequenz muss eine Ziffer länger als der vorherige sein. So 3
(0 - te Ziffer von Pi) ist das erste Mal , wenn ein Lauf von Ziffern auftritt (Länge 1). Das nächste Vorkommen ist 33
(Ziffern 24 und 25 von pi). Natürlich erfordert diese Sequenz, dass sich die Ziffern von pi in der Basis 10 befinden .
Die bisher bekannten und die ersten sechs kommen alle innerhalb der ersten 800 Ziffern vor:
3
33
111
9999
99999
999999
3333333
44444444
777777777
6666666666
... (not in first 2 billion digits)
Beachten Sie, dass die aufeinanderfolgenden Neunen alle zusammen im selben Durchlauf auftreten. Wenn also der nächste größere Durchlauf 1000 aufeinanderfolgende 0
Sekunden enthält, werden dadurch mehrere Terme der Sequenz ausgefüllt.
Ich habe mit meinem Programm keine Begriffe mehr gefunden. Ich weiß, dass die ersten 50000 oder mehr Ziffern keine weiteren Begriffe enthalten. Mein Programm hat mit 500000 Ziffern zu lange gedauert, also habe ich aufgegeben.
Du darfst:
- Gib die Sequenz für immer aus
- Nimm eine ganze Zahl
n
und finde die erstenn
Zahlen in der Folge - Nehmen Sie eine ganze Zahl
n
und suchen Sie die Zahlen in der Reihenfolge, die in den erstenn
Ziffern von pi enthalten ist.
Stellen Sie sicher, dass Sie angeben, welchen Code Ihr Code verwendet. Die Zahl n
kann null oder eins sein.
Inspiriert von dieser Mathoverflow-Frage .
Antworten:
Mathematica, 85 Bytes
Anonyme Funktion. Nimmt n als Eingabe und gibt die Elemente der Sequenz in den ersten n Stellen von π zurück. Die Ausgabe erfolgt in Form von
{0, 3, 33, 111, ...}
.quelle
Python 2, 110 Bytes
Die maximale Anzahl der zu überprüfenden Stellen wird von stdin übernommen. 10.000 Stellen werden mit PyPy 5.3 in ungefähr 2 Sekunden beendet.
Beispielnutzung
Etwas Nützliches
Ich habe dafür von Chudnovsky zu Ramanujan 39 gewechselt. Chudnovsky hatte kurz nach 100 Millionen Stellen keinen Speicher mehr auf meinem System, aber Ramanujan schaffte es in nur 38 Minuten auf 400 Millionen. Ich denke, dies ist ein weiterer Fall, in dem die langsamere Wachstumsrate der Terms am Ende zumindest auf einem System mit begrenzten Ressourcen gewinnt.
Beispielnutzung
Schnellere, unbegrenzte Generatoren
Die in der Problembeschreibung angegebene Referenzimplementierung ist interessant. Es wird ein unbegrenzter Generator verwendet, der direkt aus dem Artikel Unbounded Spigot Algorithms for the Digits of Pi stammt . Dem Autor zufolge sind die bereitgestellten Implementierungen "absichtlich undurchsichtig", weshalb ich mich entschied, alle drei vom Autor aufgelisteten Algorithmen ohne absichtliche Verschleierung neu zu implementieren. Ich habe auch eine vierte hinzugefügt, basierend auf Ramanujan # 39 .
Anmerkungen
Oben sind 6 Implementierungen aufgeführt: die zwei vom Autor bereitgestellten Referenzimplementierungen (bezeichnet
_ref
) und vier, die Terme in Stapeln berechnen, wobei mehrere Ziffern gleichzeitig generiert werden (_md
). Alle Implementierungen wurden mit 100.000 Ziffern bestätigt. Bei der Auswahl der Losgrößen habe ich Werte gewählt, die mit der Zeit langsam an Genauigkeit verlieren. Zum Beispielg1_md
erzeugt 10 Stellen pro Charge, mit 33 Iterationen. Dies ergibt jedoch nur ~ 9,93 korrekte Ziffern. Wenn die Genauigkeit nicht mehr ausreicht, schlägt die Prüfbedingung fehl und es wird ein zusätzlicher Stapel ausgeführt. Dies scheint performanter zu sein, als mit der Zeit langsam mehr und nicht mehr benötigte Präzision zu erlangen.Eine zusätzliche Variable
j
wird beibehalten und repräsentiert2*i+1
. Der Autor macht dasselbe in der Referenzimplementierung. Die Berechnungn
getrennt ist viel einfacher (und weniger dunkel), weil es die aktuellen Werte verwendetq
,r
undt
, anstatt die nächste.Der Scheck
n == q/s
ist zugegebenermaßen ziemlich lasch. Das sollte heißenn == (q*(k+2*j+4)+r)/(s*(k+2*j+4)+t)
, woj
ist2*i-1
undk
isti*i
. Bei höheren Iterationen, dier
undt
werden Begriffe immer mehr an Bedeutung. So wie es ist, ist es gut für die ersten 100.000 Stellen, also ist es wahrscheinlich gut für alle. Der Autor stellt keine Referenzimplementierung zur Verfügung.Der Autor vermutet, dass es unnötig ist, zu überprüfen, ob
n
sich dies bei nachfolgenden Iterationen nicht ändert, und dass dies nur dazu dient, den Algorithmus zu verlangsamen. Wahrscheinlich stimmt das, aber der Generator behält ~ 13% mehr korrekte Ziffern bei, als er derzeit generiert hat, was etwas verschwenderisch zu sein scheint. Ich habe das Einchecken wieder aufgenommen und gewartet, bis 50 Ziffern korrekt sind, und sie alle auf einmal generiert, mit einem spürbaren Leistungsgewinn.Berechnet als Aufgrund der anfänglichen (3528 ÷) Komposition ist es
leider
s
keine Null, aber dennoch deutlich schneller als g3. Die Konvergenz beträgt ~ 5,89 Stellen pro Term, wobei jeweils 3511 Stellen generiert werden. Wenn das ein bisschen zu viel ist, ist das Generieren von 271 Stellen pro 46 Iterationen ebenfalls eine gute Wahl.Timings
Auf meinem System aufgenommen, nur zu Vergleichszwecken. Die Zeiten sind in Sekunden angegeben. Wenn ein Timing länger als 10 Minuten dauerte, habe ich keine weiteren Tests durchgeführt.
Es ist interessant , dass
g2
schließlich einholtg3
, trotz einer geringeren Rate der Konvergenz. Ich vermute, das liegt daran, dass die Operanden deutlich langsamer wachsen und sich langfristig durchsetzen. Die schnellste Implementierungg4_md
ist ungefähr 235x schneller als dieg3_ref
Implementierung auf 500.000 Stellen. Das heißt, es gibt immer noch einen erheblichen Overhead für das Streamen von Ziffern auf diese Weise. Die direkte Berechnung aller Ziffern mit Ramanujan 39 ( Python-Quelle ) ist ungefähr 10-mal so schnell.Warum nicht Chudnovsky?
Der Chudnovsky-Algorithmus erfordert eine Quadratwurzel mit voller Genauigkeit, in der ich ehrlich gesagt nicht sicher bin, wie ich arbeiten soll - vorausgesetzt, es könnte überhaupt möglich sein. Ramanujan 39 ist in dieser Hinsicht etwas Besonderes. Die Methode scheint jedoch Machin-ähnlichen Formeln, wie sie von y-cruncher verwendet werden, förderlich zu sein, so dass es sich möglicherweise um eine Möglichkeit handelt, die es wert ist, erkundet zu werden.
quelle
Haskell, 231 Bytes
Hierbei werden die Unbounded Spigot-Algorithmen für die Ziffern von Pi von Jeremy Gibbons, 2004, verwendet. Das Ergebnis ist
p
. Technisch sollte es unendliche Ausgabesequenzen unterstützen, aber das kann eine Weile dauern (und ist durch Ihren Speicher begrenzt).quelle
Python 2, 298 Bytes
Beachten Sie, dass der Code zum Generieren von pi der Implementierung des OP entnommen ist.
Mein erster Golfversuch in Python. Gibt die Sequenz für immer aus.
quelle
π
hier rechnen ? Sie berechnen natürlich pi, oder?π
dort nicht ewig?yield
was es stoppt, aber ich bin nicht sehr gut in Pythonp
TeilPython 3.5,
278263 Bytes:Dies nimmt
n
als Eingabe die erstenn
Ziffern von aufπ
und gibt dann die Mitglieder der Sequenz in diesen erstenn
Ziffern aus. Hierbei wird das in Python integrierte Dezimalmodul verwendet , um die Gleitkomma-Beschränkungen von Python zu überschreiten. Anschließend wird die Genauigkeit oder das Epsilon auf die Benutzereingaben festgelegt. Zur Berechnungπ
werden dann 50 Iterationen unter Verwendung des effizienten Gausse-Legendre-Algorithmus durchlaufen , da der Algorithmus anscheinend jedes Mal die Anzahl der korrekten Stellen verdoppelt, und daher können wir in 50 Iterationen auf die richtigen Stellen aufsteigen2^50
oder diese1,125,899,906,842,624
korrigieren. Nachdem die Berechnungen abgeschlossen sind, wird ein regulärer Ausdruck mit Zeichenfolgenformatierung in einerwhile
Schleife zum Suchen und Drucken verwendetre
Übereinstimmungsobjekte (von denen ich hoffe, dass sie in Ordnung sind) für alle fortlaufenden, sich wiederholenden Ziffern, die eine Stelle länger sind als in der vorherigen Iteration durch die Schleife.Mit diesem Algorithmus konnte ich erfolgreich und genau
π
bis zu10,000,000
(zehn Millionen) Stellen berechnen , was ungefähr 4 Stunden und 12 Minuten dauerte. Das Folgende war die endgültige Ausgabe:Ich kann also mit Sicherheit sagen, dass die achte Zahl in der Folge nicht einmal innerhalb der ersten 10 Millionen Ziffern vorkommt!
π
ist eine Zufallszahl ...quelle