In Anlehnung an den Monte-Carlo-Schätzer von Pi besteht diese Herausforderung darin, den kürzesten Code für die Konstante Pi zu erzeugen. Außer hier muss Ihr Code für immer aufeinanderfolgende Ziffern von pi ausgeben.
Dies ist Code Golf, daher gewinnt die kürzeste Übermittlung (in Bytes), außer dass die ersten 10.000 Ziffern in weniger als 10 Sekunden auf einem vernünftigen PC ausgegeben werden müssen und niemals beendet werden dürfen.
Sie können keine integrierten Funktionen für Pi oder Trigger verwenden.
Die feste Grenze für die Codegröße wurde entfernt.
3141...
ist das - aufeinanderfolgende Ziffern von pi.Antworten:
CJam - 48
Dies berechnet π als 2 * Summe (k! / (2k + 1) !!) mit immer größerer Genauigkeit und druckt bei jedem Schritt eine Reihe von Ziffern, von denen es aufgehört hat.
Sie können online eine modifizierte Version ausprobieren , die nur 8 Iterationen (äußere Schleife) ausführt und 512 Ziffern druckt, oder den Java-Interpreter für die reale Sache verwenden. Auf meinem Laptop werden es in ungefähr 6 Sekunden 16384 Stellen.
Hinweis: Dieses Programm ist sehr speicherhungrig. Eine besser erzogene, aber etwas längere Version ist:
Erläuterung:
quelle
Python, 138 Bytes
Implementierung von http://www.cs.ox.ac.uk/jeremy.gibbons/publications/spigot.pdf .
quelle
GolfScript (81 Zeichen)
Online-Demo (das ist viel langsamer als ein vernünftiger Desktop und hat triviale Codeänderungen, um eine endliche Anzahl von Schleifen durchzuführen).
Ich habe natürlich den Zapfenalgorithmus verwendet, den ich in einem früheren Kommentar erwähnt habe, aber ich habe eine Weile gebraucht, um ihn zu meiner Zufriedenheit zu spielen. Der in Gibbons 'Arbeit vorgestellte Algorithmus ist (Pseudocode)
Das obige GolfScript entspricht (Pseudocode)
Dadurch werden einige Zeichen bei der Initialisierung und bei der Stapelverwaltung gespeichert.
quelle
Pyth -
8785 BytesEine weitere Übersetzung von http://www.cs.ox.ac.uk/jeremy.gibbons/publications/spigot.pdf . Ich wollte Python machen, aber @orlp hat mich geschlagen, also habe ich Pyth gemacht. Klein genug, um in einen Tweet zu passen.
Es gibt eine Ausgabe an stdout aus, wenn auch in intermittierenden Schritten, da der Druckpuffer aus der Druckeinstellung stammt
end=""
. Ich drucke derzeit keinen Dezimalpunkt, da in der Spezifikation "aufeinanderfolgende Ziffern" steht. Es sind die Aufgaben, die meine Punktzahl töten.Probieren Sie es hier aus . (Hinweis: Da der Online-Interpreter nur vollständige Ergebnisse liefert, ist die Endlosschleife ausgefallen, sodass nur die ersten 100 gedruckt werden, wodurch sich die Codegröße erhöht. Laden Sie den lokalen Interpreter herunter, um die Endlosversion auszuprobieren.)
Zeitliche Koordinierung
Auf meiner Google Cloud Compute-Mikroinstanz hat es laut Gnu-Zeit gedauert:
real: 0m2.062s
Es ist also offensichtlich schnell genug.quelle
Scala, 599 Bytes
Der folgende Code ist ein gerader Port des Pascal-Codes aus Anhang 2 eines Spigot-Algorithmus für die Ziffern von Pi . Offensichtlich wurde noch sehr wenig Golf gespielt. Der Code generiert 10.000 Ziffern in
piSpigot(10000)
weniger als 10 Sekunden mit und wenn man einen unendlichen Speicher hat, kann er so parametrisiert werden, dass er viele Ziffern erzeugt, aber nicht unendlich. Ich bin nicht sicher, ob dies die Problembeschränkungen erfüllt. Bitte geben Sie Feedback.quelle
n
. Siehe z. B. cs.ox.ac.uk/people/jeremy.gibbons/publications/spigot.pdfBefunge-98 (PyFunge), 120 Bytes
Probieren Sie es online aus!
Dies ist eine Grenze in Bezug auf das Zeitlimit. 10.000 Stellen dauern auf meinem Laptop ungefähr 11 Sekunden, aber ich bin mir sicher, dass es einen "vernünftigen" PC geben muss, der dies schneller kann.
Wenn Sie es jedoch auf TIO ausprobieren, beachten Sie, dass es nichts zurückgibt, bis das Zeitlimit von 60 Sekunden erreicht ist, da der Algorithmus so konzipiert ist, dass er für immer weitergeht. Zu diesem Zeitpunkt haben Sie jedoch weit mehr als 10.000 Stellen.
Ich verwende den Jeremy Gibbons-Zapfenalgorithmus, der meiner Meinung nach mit den meisten anderen Antworten hier identisch ist. Beachten Sie jedoch, dass dies davon abhängt , dass der Interpreter über Speicherzellen mit beliebiger Genauigkeit verfügt. Die einzige mir bekannte Implementierung, die dies unterstützt, ist PyFunge .
Erläuterung
quelle