Golfscript, 71 70 69 karakter
2\!:^2^..292^15.2/3]{(.)2/.9>+{\+.((}*;.}do;;]-1%{^0@{2$*+\}/"/"\n}/;
(Menganggap bahwa Anda tidak memberikan apa pun pada stdin)
Saya tidak ingin mendengar lagi desahan oleh orang-orang yang tidak memiliki konstanta bawaan untuk pi. Saya bahkan tidak memiliki angka floating point!
Lihat http://en.wikipedia.org/wiki/Continued_fraction#Best_rational_approximations untuk latar belakang.
# 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]
sudah mengejutkan saya.Mathematica,
6763Ini tidak akan cepat, tetapi saya percaya secara teknis benar.
Round[π, x]
memberikan fraksi terdekat ke π dalam langkah-langkahx
. Ini "dapat didaftar" begituRound[π,1/Range@1*^6]
juga untuk semua fraksi sampai ke1/10^6
urutan. Daftar yang dihasilkan dengan banyak perkiraan rasional "buruk" kemudian berulang kali (//.
) diproses dengan menghapus elemen yang lebih jauh dari π daripada yang sebelumnya.sumber
Round[Pi, x]
memberikan fraksi terdekat kePi
dalam langkahx
. Ini "dapat didaftar" demikianRound[Pi,1/Range@1*^6]
juga untuk semua fraksi hingga 1/10 ^ 6 secara berurutan. Daftar yang dihasilkan dengan banyak perkiraan rasional "buruk" kemudian berulang kali (//.
) diproses dengan menghapus elemen yang lebih jauh dari pi daripada yang sebelumnya.Select[Round[f=Pi,1/Range@1*^6],If[#<f,f=#;True]&@Abs[#-Pi]&]
... tapi tidak berguna karena bias dominanPerl, 77 karakter
Tantangan kecil adalah bahwa Perl tidak memiliki konstanta built-in π yang tersedia, jadi saya pertama-tama harus menghitungnya
atan2(0,-1)
. Saya yakin ini akan dikalahkan oleh bahasa yang lebih cocok untuk pekerjaan itu, tapi itu tidak buruk untuk bahasa yang terutama dirancang untuk pemrosesan teks.sumber
999999
ke1e6
dan menyimpan 3 karakter.String found where operator expected at prog.pl line 1, near "say"$=/$_""
-M5.01
sakelar (dan Perl 5.10.0 atau lebih baru) untuksay
perintah. Maaf karena tidak menyebutkan itu.Python,
969389 karakterPython,
9593 karakter, algoritma berbedaCatatan: Itu lebih sedikit karakter untuk ditulis
p=3.14159265359;
daripadafrom math import*
. Sialan impor bertele-tele itu!sumber
1.0
->1.
,10**6
->1e6
JS (95 karakter)
Itu mencetak 167 baris.
sumber
Ruby 1.9, 84 karakter
sumber
C99, 113 karakter
Perlu dikompilasi dengan
-lm
, dan mungkin penuh dengan perilaku yang tidak terdefinisi, tetapi berhasil bagi saya.sumber
Scala - 180 karakter
// ungolfed: 457
Anotasi tailrec hanyalah sebuah cek, untuk memverifikasi, bahwa itu ekor-rekursif, yang seringkali merupakan peningkatan kinerja.
sumber
pi.scala:1 error: not found: value math
math
denganMath
mungkin sudah cukup. Saya menyebutkan simplyscala pada metathread ini, jika Anda mencarinya lagi: meta.codegolf.stackexchange.com/a/401/373Mathematica
1817 karakterSaya memilih untuk menggunakan, sebagai ukuran "terbaik", jumlah istilah dalam representasi fraksi lanjutan π. Dengan kriteria ini, perkiraan rasional terbaik dari π adalah konvergennya.
Ada 10 konvergensi π dengan penyebut kurang dari satu juta. Ini kurang dari persyaratan 167 yang diminta, tapi saya memasukkannya di sini karena mungkin menarik bagi orang lain.
Jika Anda benar-benar ingin melihat penyebut untuk konvergen pertama, akan dikenakan biaya tambahan 11 karakter:
Bagi mereka yang tertarik, berikut ini menunjukkan hubungan antara konvergensi, negosiasi parsial, dan ekspresi fraksi lanjutan dari konvergensi π:
Maafkan pemformatan fraksi lanjutan yang tidak konsisten.
sumber
C #
140129 karakterKode tidak terkompresi
sumber
var
tidak selalu temanmu. Dengan menghapusnya demidouble
Anda, Anda dapat menggabungkan deklarasi, kehilangan persyaratan untuk menggunakan literal ganda, dan dapat menghemat 16 karakter. OTOH pertanyaannya meminta program, jadi Anda akan kehilangan beberapa untuk menambahkan deklarasi kelas danMain
metode.J,
6965Baru
Masih pendekatan yang kasar tetapi jauh lebih cepat dan sedikit lebih pendek.
Tua
"Kekuatan kasar" yang sederhana:
buat daftar
a/b
s dan kemudian buang yang lebih jauh dari π untuk beberapa orangb'<b
.Catatan: Ubah
1e3
ke1e6
untuk daftar lengkap. Pergi lakukan sesuatu yang lain dan kembali lagi nanti.sumber