Sudah ada 30 tantangan yang didedikasikan untuk pi tetapi tidak satu pun yang meminta Anda untuk menemukan desimal ke-n, jadi ...
Tantangan
Untuk sembarang bilangan bulat dalam rentang 0 <= n <= 10000
tampilan desimal ke-pi.
Aturan
- Desimal adalah setiap angka setelahnya
3.
- Program Anda mungkin sebuah fungsi, atau program penuh
- Anda harus menampilkan hasilnya dalam basis 10
- Anda dapat memperoleh
n
dari metode input yang cocok (stdin, input (), parameter fungsi, ...), tetapi tidak hardcoded - Anda dapat menggunakan pengindeksan berbasis 1 jika itu asli bahasa pilihan Anda
- Anda tidak harus berurusan dengan input yang tidak valid (
n == -1
,n == 'a'
ataun == 1.5
) - Builtin diizinkan, jika mendukung setidaknya 10 ribu desimal
- Runtime tidak masalah, karena ini tentang kode terpendek dan bukan kode tercepat
- Ini adalah kode-golf , kode terpendek dalam byte yang menang
Uji kasus
f(0) == 1
f(1) == 4 // for 1-indexed languages f(1) == 1
f(2) == 1 // for 1-indexed languages f(2) == 4
f(3) == 5
f(10) == 8
f(100) == 8
f(599) == 2
f(760) == 4
f(1000) == 3
f(10000) == 5
Untuk referensi, berikut adalah angka 100k pertama pi.
str(pi())[n+2]
Jawaban:
05AB1E, 3 byte
Dijelaskan
Cobalah online
Menggunakan pengindeksan berbasis 1.
Mendukung hingga 100 ribu digit.
sumber
Python 2, 66 byte
Input diambil dari stdin.
Contoh Penggunaan
sumber
n
menjadi input plus 9, Anda dapat menghindari parens.L
ke string.Bash + coreutils,
6049 byteecho "scale=10100;4*a(1)"|bc -l|tr -d '\\\n'|cut -c$(($1+2))
Ditingkatkan oleh Dennis . Terima kasih!
Indeks ini berbasis satu.
sumber
Python 2,
737173 byteterima kasih kepada @aditsu untuk meningkatkan skor saya 2 byte
Akhirnya sebuah algoritma yang bisa selesai di bawah 2 detik.
Ide itu!
Menggunakan formula
pi = 4*arctan(1)
saat menghitungarctan(1)
menggunakan seri taylor-nya.sumber
f=lambda n:...
.(lambda n:`p`[n+1])(1)
,(lambda n:`p`[n+1])(2)
, ...).import
pernyataan sebelumnya, hanya saja ini membuat beberapa variabel global sebelumnya.i=3 while a:a=i/2*a/i;p+=a;i+=2
untuk 4.MATL,
1110 byte1 byte disimpan berkat @Luis
Solusi ini menggunakan pengindeksan berbasis 1
Cobalah secara Online
Semua uji kasus
Penjelasan
sumber
YP
pengujian kotak alat simbolis sayaMathematica 30 byte
1
4
1
5
8
8
2
4
3
5
sumber
Sage,
3225 byteJawaban pertama saya dalam bahasa semacam ini.
n
putaranpi
ke 17775 digit.sumber
print
panggilan, atau ini adalah cuplikan yang hanya berfungsi di REPL.lambda d:`n(pi,digits=d+5)`[-4]
[-8]
proposal.CJam, 32
Cobalah online (ini agak lambat)
sumber
Mathematica,
2321 byteSageMath, 24 byte
sumber
Pi
dan⌋
(atau antara#
dan⌋
jika perkalian dibalik), sehingga penghematan menghilang.J ,
1915 byteMengambil integer n dan menghasilkan digit ke- n dari pi. Menggunakan pengindeksan berbasis nol. Untuk mendapatkan digit ke- n , hitung pi kali 10 n +1 , ambil pijakan nilainya, lalu bawa modulo 10.
Pemakaian
Inputnya adalah integer yang diperluas.
Pada mesin, dibutuhkan sekitar 18 menit untuk menghitung 10000 th digit.
Penjelasan
sumber
Clojure, 312 byte
Jadi, seperti yang mungkin Anda tahu, saya tidak tahu apa yang saya lakukan. Ini akhirnya menjadi lebih lucu dari apa pun. Saya Google akan "pi to n digit", dan berakhir di halaman Wikipedia untuk rumus Bailey – Borwein – Plouffe . Mengetahui Kalkulus (?) Yang hanya cukup untuk membaca rumus, saya berhasil menerjemahkannya ke Clojure.
Terjemahan itu sendiri tidak terlalu sulit. Kesulitan datang dari penanganan presisi hingga n-digit, karena formula membutuhkan
(Math/pow 16 precision)
; yang menjadi sangat besar sangat cepat. Saya perlu menggunakan diBigDecimal
mana-mana untuk ini untuk bekerja, yang benar-benar membengkak.Tidak Disatukan:
Tak perlu dikatakan, saya yakin ada cara yang lebih mudah untuk melakukan ini jika Anda tahu matematika.
sumber
Clojure, 253 byte
Hitung angka pi menggunakan rumus ini . Harus mendefinisikan ulang makro
with-precision
karena terlalu sering digunakan.Anda dapat melihat hasilnya di sini: https://ideone.com/AzumC3 1000 dan 10000 melebihi batas waktu yang digunakan pada ideone, mengangkat bahu
sumber
Python 3 , 338 byte
Implementasi ini didasarkan pada algoritma Chudnovsky , salah satu algoritma tercepat untuk memperkirakan pi. Untuk setiap iterasi, sekitar 14 digit diperkirakan (lihat di sini untuk detail lebih lanjut).
Cobalah online!
sumber
Java 7,
262260 byteDigunakan @ LeakyNun ini algoritma Python 2 .
Tidak digabungkan & kode uji:
Coba di sini.
Keluaran:
sumber
Smalltalk - 270 byte
Bergantung pada identitas
tan⁻¹(x) = x − x³/3 + x⁵/5 − x⁷/7 ...
, dan ituπ = 16⋅tan⁻¹(1/5) − 4⋅tan⁻¹(1/239)
. SmallTalk menggunakan aritmatika integer presisi tak terbatas sehingga akan bekerja untuk input besar, jika Anda bersedia menunggu!Simpan sebagai
pi.st
dan jalankan seperti dalam kasus uji berikut. Pengindeksan adalah berbasis satu.sumber
JavaScript (Node.js) (Chrome 67+),
75736763 byteCobalah online!
JavaScript (Node.js) (Chrome 67+),
9089 byteCobalah online!
sumber
Maple, 24 byte
Kasus uji:
sumber
C #,
252250 byteCobalah online!
sumber