Pi adalah bilangan irasional , yang berarti bahwa representasi desimalnya tidak pernah berakhir atau terulang.
Pi terpotong menjadi 41 angka desimal (40 tempat) 3.1415926535897932384626433832795028841971
.
Jika kita mengabaikan titik desimal dan mendaftar angka sebagai urutan bilangan bulat positif, menghindari duplikat , kita dapatkan 3 1 4 15 9 2 6 5 35 8 97 93 23 84 62 64 33 83 27 950 28 841 971
( OEIS A064809 ).
(Perhatikan yang 15
muncul dalam urutan bukan 1 5
karena 1
sudah terjadi.
Juga perhatikan yang 0
tidak terjadi karena tidak positif; 950
berisi nol pertama.)
Untuk membangun angka pirasional pertama, kami menggunakan urutan ini untuk mengindeks ke dalam digit Pi (digit pertama adalah 3, angka kedua 1, dll.).
Jadi digit pertama dari angka pirrasional pertama adalah digit ke-3 Pi,
digit kedua adalah digit pertama Pi,
digit ketiga adalah digit ke-4 Pi, digit
keempat adalah digit ke - 15 Pi,
dan seterusnya.
Titik desimal ditambahkan setelah digit pertama untuk meniru Pi.
Dengan demikian angka pirrasional pertama hingga 41 digit adalah 4.3195195867462520687356193644029372991880
.
(Perhatikan bahwa untuk digit ke-30 saya harus terus ke digit ke-974 dari Pi.)
Untuk membangun bilangan pirasional kedua, prosesnya diulangi menggunakan bilangan pirasional pertama alih-alih Pi. (Pi itu sendiri dapat disebut angka pirerasional nol). Jadi urutan baru adalah 4 3 1 9 5 19 58 ...
dan nomor piirasional pertama diindeks untuk menghasilkan yang kedua, yang dimulai 9.14858...
.
Bilangan pirasional lebih lanjut dibuat dengan cara yang sama, masing-masing dihasilkan dari yang sebelumnya.
Tantangan
Tugas Anda adalah menulis program sesingkat mungkin yang menggunakan dua bilangan bulat, N
dan D
, dan menampilkan N
bilangan pirasional ke D
angka desimal.
D
selalu positif tetapi N
tidak negatif, dan D
angka-angka Pi harus dikeluarkan ketika N
0.
Ketika D
1 adalah tidak masalah apakah titik desimal ada atau tidak.
Input harus berasal dari stdin atau baris perintah dan output harus pergi ke stdout (atau alternatif terdekat bahasa Anda).
Program Anda harus bekerja untuk semua nilai input dari N
dan di D
bawah 2 16 , tetapi tidak harus tepat waktu atau efisien.
Kode terpendek dalam byte menang.
(Perhatikan bahwa angka-angka pembajakan keluar di pangkalan lain, tetapi segala sesuatu dalam tantangan ini dilakukan di pangkalan 10.)
N=1
,D=13393
misalnya, Anda akan perlu digit 31 sepersejuta PIJawaban:
Python 292 byte
Cukup tidak efisien, saya hanya bisa mendapatkan beberapa digit N = 3 dan tidak ada N = 4.
Input sampel:
sumber
=="0"
ke<"1"
. Buat bagian dalam sambil melingkar satu baris. Hapus spasi di sekitarx += 1
.if l not in h
->if(l in h)<1:
N==0
->N<1
if(l in h)<1
juga cukup pintar.s
sebagai parameterP
(def P(N,D,s=''):
).str(...)
mungkin dapat ditulis dengan backticks.while'1'>...
menghemat ruang. Buath
satu set dan inisialisasi denganh=l,={''}
, lalu tulisl in h
sebagai{l}<h
.h
dipesan. Tetap saja, itu trik yang rapi yang akan saya coba dan ingat.while j+1:
dapat disingkat menjadiwhile-~j
, btw.Haskell,
431400369Harus mencintai daftar yang tak terbatas! Diberi cukup waktu dan memori, program ini pada akhirnya akan menghitung jawaban yang tepat untuk N dan D (saya berasumsi).
Saya menghasilkan digit pi dengan
g
menggunakan algoritma keran (tanpa malu dicuri dari seorang pria bernama Stanley Rabinowitz), mengelompokkan digit / membuat urutan menggunakanv
dan menghasilkan nomor bajakan dari penggunaan inim
.Ini dia sedang beraksi:
sumber