Golfscript, 71 70 69 Zeichen
2\!:^2^..292^15.2/3]{(.)2/.9>+{\+.((}*;.}do;;]-1%{^0@{2$*+\}/"/"\n}/;
(Angenommen, Sie geben nichts an stdin weiter)
Ich möchte von Leuten, die keine eingebauten Konstanten für pi haben, kein Surren mehr hören. Ich habe nicht einmal Gleitkommazahlen!
Informationen zum Hintergrund finden Sie unter http://en.wikipedia.org/wiki/Continued_fraction#Best_rational_approximations .
# No input, so the stack contains ""
2\!:^2^..292^15.2/3]
# ^ is used to store 1 because that saves a char by allowing the elimination of whitespace
# Otherwise straightforward: stack now contains [2 1 2 1 1 1 292 1 15 7 3]
# Pi as a continued fraction is 3+1/(7+1/(15+1/(...)))
# If you reverse the array now on the stack you get the first 10 continuants followed by 2
# (rather than 3)
# That's a little hack to avoid passing the denominator 1000000
{
# Stack holds: ... [c_n c_{n-1} ... c_0]
(.)2/.9>+
# Stack holds ... [c_{n-1} ... c_0] c_n (1+c_n)/2+((1+c_n)/2 > 9 ? 1 : 0)
# (1+c_n)/2 > 9 is an ad-hoc approximation of the "half rule"
# which works in this case but not in general
# Let k = (1+c_n)/2+((1+c_n)/2 > 9 ? 1 : 0)
# We execute the next block k times
{
# ... [c_{n-1} ... c_0] z
\+.((
# ... [z c_{n-1} ... c_0] [c_{n-1} ... c_0] z-1
}*
# So we now have ... [c_n c_{n-1} ... c_0] [(c_n)-1 c_{n-1} ... c_0] ...
# [(c_n)-k+1 c_{n-1} ... c_0] [c_{n-1} ... c_0] c_n-k
;
# Go round the loop until the array runs out
.
}do
# Stack now contains all the solutions as CFs in reverse order, plus two surplus:
# [2 1 2 1 1 1 292 1 15 7 3] [1 2 1 1 1 292 1 15 7 3] ... [6 3] [5 3] [4 3] [3] [2] []
# Ditch the two surplus ones, bundle everything up in an array, and reverse it
;;]-1%
# For each CF...
{
# Stack holds ... [(c_n)-j c_{n-1} ... c_0]
# We now need to convert the CF into a rational in canonical form
# We unwind from the inside out starting with (c_n)-j + 1/infinity,
# representing infinity as 1/0
^0@
# ... 1 0 [c_n-j c_{n-1} ... c_0]
# Loop over the terms of the CF
{
# ... numerator denominator term-of-CF
2$*+\
# ... (term-of-CF * numerator + denominator) numerator
}/
# Presentation
"/"\n
# ... numerator "/" denominator newline
}/
# Pop that final newline to avoid a trailing blank line which isn't in the spec
;
"#{Math.PI}"
.2\!:^2^..292^15.2/3]
hat mich schon umgehauen.Mathematica,
67,63Das wird nicht schnell gehen, aber ich glaube, es ist technisch korrekt.
Round[π, x]
gibt den nächsten Bruch zu π in Schritten von anx
. Dies ist "auflistbar", diesRound[π,1/Range@1*^6]
gilt auch für alle Brüche1/10^6
in der angegebenen Reihenfolge. Die resultierende Liste mit vielen "schlechten" rationalen Approximationen wird dann wiederholt (//.
) verarbeitet, indem alle Elemente entfernt werden, die weiter von π entfernt sind als das vorhergehende.quelle
Round[Pi, x]
gibt den nächsten BruchPi
in Schritten von anx
. Dies ist "auflistbar", diesRound[Pi,1/Range@1*^6]
gilt auch für alle Brüche bis hinunter zu 1/10 ^ 6 in der Reihenfolge. Die resultierende Liste mit vielen "schlechten" rationalen Approximationen wird dann wiederholt (//.
) verarbeitet, indem alle Elemente entfernt werden, die weiter von pi entfernt sind als das vorhergehende.Select[Round[f=Pi,1/Range@1*^6],If[#<f,f=#;True]&@Abs[#-Pi]&]
... aber angesichts der vorherrschendenPerl, 77 Zeichen
Eine kleine Herausforderung ist, dass Perl keine eingebaute π- Konstante zur Verfügung hat, also musste ich sie zuerst als berechnen
atan2(0,-1)
. Ich bin sicher, dass dies von Sprachen übertroffen wird, die besser für den Job geeignet sind, aber es ist nicht schlecht für eine Sprache, die hauptsächlich für die Textverarbeitung entwickelt wurde.quelle
999999
um1e6
3 Zeichen speichern.String found where operator expected at prog.pl line 1, near "say"$=/$_""
-M5.01
Schalter (und Perl 5.10.0 oder höher) für densay
Befehl. Entschuldigung, dass ich das nicht erwähne.Python,
969389 ZeichenPython,
9593 Zeichen, anderer AlgorithmusHinweis: Es waren weniger Zeichen zu schreiben
p=3.14159265359;
alsfrom math import*
. Verdammt diese wortreichen Importe!quelle
1.0
->1.
,10**6
->1e6
JS (95 Zeichen)
Es werden 167 Zeilen gedruckt.
quelle
Ruby 1.9, 84 Zeichen
quelle
C99, 113 Zeichen
Müssen kompilieren
-lm
und wahrscheinlich voller undefinierter Verhalten, aber es funktioniert bei mir.quelle
Scala - 180 Zeichen
// ungolfed: 457
Die Tailrec-Annotation ist nur eine Überprüfung, um sicherzustellen, dass sie rekursiv ist, was häufig eine Leistungsverbesserung darstellt.
quelle
pi.scala:1 error: not found: value math
math
durchMath
ausreichend sein. Ich habe simplyscala auf diesem Metakopf erwähnt, falls Sie noch einmal danach suchen: meta.codegolf.stackexchange.com/a/401/373Mathematica
1817 ZeichenIch habe mich dafür entschieden, die Anzahl der Terme in einer fortgesetzten Bruchdarstellung von π als Maß für "das Beste" zu verwenden. Nach diesem Kriterium sind die besten rationalen Näherungen für π die Konvergenten.
Es gibt 10 Konvergenten von π mit einem Nenner von weniger als einer Million. Dies ist weniger als die angeforderten 167 Begriffe, aber ich beziehe es hier ein, weil es für andere von Interesse sein kann.
Wenn Sie den Nenner für die erste Konvergenz wirklich sehen möchten, kostet dies zusätzlich 11 Zeichen:
Für diejenigen, die interessiert sind, zeigt das Folgende die Beziehungen zwischen den Konvergenten, Teilquotienten und der fortgesetzten Bruchexpression von Konvergenten von π:
Bitte entschuldigen Sie die inkonsistente Formatierung der fortgesetzten Brüche.
quelle
C #
140129 ZeichenNicht komprimierter Code
quelle
var
ist nicht immer dein Freund. Wenn Sie es zu Ihren Gunsten entfernen, können Siedouble
Deklarationen zusammenführen, müssen keine doppelten Literale mehr verwenden und können 16 Zeichen sparen. OTOH die Frage fragt nach einem Programm, so dass Sie ein paar verlieren, um eine Klassendeklaration und eineMain
Methode hinzuzufügen .J
69,65Neu
Immer noch ein Brute-Force-Ansatz, aber viel schneller und ein bisschen kürzer.
Alt
Eine einfache "Brute Force":
mache eine Liste von
a/b
s und verwerfe dann diejenigen, die für einige weiter von π entfernt sindb'<b
.Hinweis: Wechseln Sie
1e3
zu,1e6
um die vollständige Liste anzuzeigen. Mach etwas anderes und kehre später zurück.quelle