Golfscript, 71 70 69 znaków
2\!:^2^..292^15.2/3]{(.)2/.9>+{\+.((}*;.}do;;]-1%{^0@{2$*+\}/"/"\n}/;
(Zakłada się, że nic nie przekazujesz na standardowe wyjście)
Nie chcę słyszeć więcej jęków ludzi, którzy nie mają wbudowanych stałych dla pi. Nie mam nawet liczb zmiennoprzecinkowych!
Zobacz http://en.wikipedia.org/wiki/Continued_fraction#Best_rational_approximations dla tła.
# 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]
zadziwiła mnie.Mathematica,
6763To nie będzie szybkie, ale uważam, że jest technicznie poprawne.
Round[π, x]
daje najbliższą część π w krokach cox
. Jest to „możliwe do wyświetlenia”, podobnieRound[π,1/Range@1*^6]
jak wszystkie ułamki1/10^6
w kolejności. Powstała lista z wieloma „złymi” racjonalnymi przybliżeniami jest następnie wielokrotnie//.
przetwarzana ( ) przez usuwanie wszelkich elementów, które są dalej od π niż poprzedni.źródło
Round[Pi, x]
daje najbliższy ułamekPi
w krokach cox
. Jest to „możliwe do wyświetlenia”, podobnieRound[Pi,1/Range@1*^6]
dzieje się w przypadku wszystkich ułamków do 1/10 ^ 6 w kolejności. Powstała lista z wieloma „złymi” racjonalnymi przybliżeniami jest następnie wielokrotnie (//.
) przetwarzana przez usunięcie wszelkich elementów, które są dalej od pi niż poprzedni.Select[Round[f=Pi,1/Range@1*^6],If[#<f,f=#;True]&@Abs[#-Pi]&]
... ale bezużyteczne, biorąc pod uwagę dominujące nastawieniePerl, 77 znaków
Drobne wyzwanie polega na tym, że Perl nie ma wbudowanej stałej π , więc najpierw musiałem ją obliczyć jako
atan2(0,-1)
. Jestem pewien, że zostanie to pokonane przez języki bardziej odpowiednie dla tego zadania, ale nie jest źle dla języka przeznaczonego głównie do przetwarzania tekstu.źródło
999999
się1e6
i zaoszczędzić 3 znaki.String found where operator expected at prog.pl line 1, near "say"$=/$_""
-M5.01
przełącznik (i Perl 5.10.0 lub nowszy)say
. Przepraszam, że o tym nie wspominałem.Python,
969389 znakówPython,
9593 znaków, inny algorytmUwaga: Napisanie było mniej znaków
p=3.14159265359;
niżfrom math import*
. Niech to szlag, import!źródło
1.0
->1.
,10**6
->1e6
JS (95 znaków)
Drukuje 167 linii.
źródło
Ruby 1.9, 84 znaków
źródło
C99, 113 znaków
Muszę się skompilować
-lm
i prawdopodobnie nieokreślone zachowanie, ale działa dla mnie.źródło
Scala - 180 znaków
// nie golfił: 457
Adnotacja tailrec to tylko sprawdzenie, czy ma ona charakter rekurencyjny, co często stanowi poprawę wydajności.
źródło
pi.scala:1 error: not found: value math
math
przyMath
może być wystarczająca. Wspomniałem po prostu scscala na tej metatece, jeśli zdarzy się, że będziesz go szukać ponownie: meta.codegolf.stackexchange.com/a/401/373Mathematica
1817 znakówJako miarę „najlepszej” wybrałem liczbę terminów w ciągłym ułamkowym przedstawieniu π. Według tego kryterium najlepszymi racjonalnymi przybliżeniami π są jego zbieżności.
Istnieje 10 zbieżności π o mianowniku mniejszym niż milion. Jest to mniej niż wymagane 167 warunków, ale zamieszczam je tutaj, ponieważ mogą być interesujące dla innych.
Jeśli naprawdę chcesz zobaczyć mianownik dla pierwszego zbieżnego, będzie to kosztować dodatkowe 11 znaków:
Dla tych, którzy są zainteresowani, poniżej pokazano relacje między zbieżnymi, ilorazami cząstkowymi i ciągłym wyrażaniem ułamkowym zbieżności π:
Proszę wybaczyć niespójne formatowanie kontynuowanych ułamków.
źródło
C #
140129 znakówNieskompresowany kod
źródło
var
nie zawsze jest twoim przyjacielem. Usuwając go na swoją korzyść,double
zyskujesz możliwość scalania deklaracji, tracisz wymóg używania podwójnych literałów i możesz zapisać 16 znaków. OTOH pytanie dotyczy programu, więc stracisz kilka dodając deklarację klasy iMain
metodę.J,
6965Nowy
Nadal podejście brutalnej siły, ale znacznie szybsze i odrobinę krótsze.
Stary
Prosta „brutalna siła”:
sporządzić listę
a/b
s, a dla niektórych odrzucić te, które są dalej od πb'<b
.Uwaga: Zmiana
1e3
na1e6
pełną listę. Zrób coś innego i wróć później.źródło