Tujuan Anda adalah untuk menampilkan urutan pi (π) yang terus meningkat secara konsisten dan berurutan. Setiap istilah dalam urutan harus satu digit lebih panjang dari sebelumnya. Jadi 3
(digit ke-0 pi) adalah pertama kalinya serangkaian digit terjadi (panjang 1). Selanjutnya yang terjadi adalah 33
(digit 24 dan 25 pi). Tentu saja, urutan ini membutuhkan digit pi berada di basis 10 .
Yang diketahui sejauh ini , dan enam pertama semuanya terjadi dalam 800 digit pertama:
3
33
111
9999
99999
999999
3333333
44444444
777777777
6666666666
... (not in first 2 billion digits)
Perhatikan bahwa sembilan berturut-turut semua terjadi bersamaan, dalam proses yang sama, jadi jika proses lebih besar berikutnya yang Anda temukan terjadi 1000 kali berturut-turut 0
, ini akan mengisi beberapa istilah dalam urutan.
Saya belum menemukan ketentuan dengan program saya. Saya tahu tidak ada istilah lagi dalam 50000 digit pertama atau lebih. Program saya terlalu lama dengan 500.000 digit, jadi saya menyerah.
Kamu boleh:
- Keluarkan urutan selamanya
- Ambil bilangan bulat
n
dan temukann
angka pertama dalam urutan - Ambil bilangan bulat
n
dan temukan angka dalam urutan yang terdapat padan
digit pertama pi.
Pastikan untuk menentukan kode mana yang Anda lakukan. Jumlahnya n
mungkin nol atau satu diindeks.
Terinspirasi oleh pertanyaan aliran matematika ini .
Jawaban:
Mathematica, 85 byte
Fungsi anonim. Mengambil n sebagai input, dan mengembalikan elemen urutan dalam n digit pertama n . Output dalam bentuk
{0, 3, 33, 111, ...}
.sumber
Python 2, 110 byte
Jumlah digit maksimum untuk diperiksa diambil dari stdin. 10.000 digit selesai dalam 2s dengan PyPy 5.3.
Contoh Penggunaan
Sesuatu yang Berguna
Saya telah beralih dari Chudnovsky ke Ramanujan 39 untuk ini. Chudnovsky kehabisan memori pada sistem saya tak lama setelah 100 juta digit, tetapi Ramanujan mencapai 400 juta, hanya dalam waktu 38 menit. Saya pikir ini adalah kasus lain adalah tingkat pertumbuhan yang lebih lambat menang pada akhirnya, setidaknya pada sistem dengan sumber daya terbatas.
Contoh Penggunaan
Generator Tanpa Batas Lebih Cepat
Implementasi referensi yang diberikan dalam deskripsi masalah menarik. Ini menggunakan generator tanpa batas, diambil langsung dari kertas Algoritma Keran Tanpa Batas untuk Digit Pi . Menurut penulis, implementasi yang disediakan adalah "sengaja tidak jelas", jadi saya memutuskan untuk membuat implementasi baru dari ketiga algoritma yang terdaftar oleh penulis, tanpa kebingungan yang disengaja. Saya juga menambahkan yang keempat, berdasarkan Ramanujan # 39 .
Catatan
Di atas adalah 6 implementasi: dua implementasi referensi yang disediakan oleh penulis (dilambangkan
_ref
), dan empat yang menghitung istilah dalam batch, menghasilkan beberapa digit sekaligus (_md
). Semua implementasi telah dikonfirmasi hingga 100.000 digit. Saat memilih ukuran batch, saya memilih nilai yang secara perlahan kehilangan presisi seiring waktu. Misalnya,g1_md
menghasilkan 10 digit per batch, dengan 33 iterasi. Namun, ini hanya akan menghasilkan ~ 9,93 digit yang benar. Ketika presisi habis, kondisi pemeriksaan akan gagal, memicu bets tambahan untuk dijalankan. Ini tampaknya lebih berkinerja daripada mendapatkan secara ekstra, presisi yang tidak dibutuhkan seiring waktu.Suatu variabel tambahan
j
disimpan, mewakili2*i+1
. Penulis melakukan hal yang sama dalam implementasi referensi. Menghitungn
secara terpisah jauh lebih sederhana (dan kurang jelas), karena menggunakan nilai saat iniq
,r
dant
, daripada yang berikutnya.Cek
n == q/s
ini diakui cukup longgar. Itu harus membacan == (q*(k+2*j+4)+r)/(s*(k+2*j+4)+t)
, di manaj
adalah2*i-1
dank
adalahi*i
. Pada iterasi yang lebih tinggi,r
dant
istilah menjadi semakin kurang signifikan. Seperti, ini bagus untuk 100.000 digit pertama, jadi mungkin bagus untuk semua. Penulis tidak memberikan implementasi referensi.Penulis menduga bahwa tidak perlu memeriksa yang
n
tidak akan berubah dalam iterasi berikutnya, dan bahwa itu hanya berfungsi untuk memperlambat algoritma. Meskipun mungkin benar, generator memegang ~ 13% angka yang lebih benar daripada yang dihasilkan saat ini, yang tampaknya agak boros. Saya telah menambahkan check-in kembali, dan menunggu hingga 50 digit benar, menghasilkan semuanya sekaligus, dengan perolehan kinerja yang nyata.Dihitung sebagai
Sayangnya,
s
tidak nol, karena komposisi awal (3528 ÷), tetapi masih secara signifikan lebih cepat daripada g3. Konvergensi adalah ~ 5,89 digit per term, 3511 digit dihasilkan pada suatu waktu. Jika itu sedikit banyak, menghasilkan 271 digit per 46 iterasi juga merupakan pilihan yang layak.Pengaturan waktu
Diambil di sistem saya, hanya untuk tujuan perbandingan. Waktu tercantum dalam hitungan detik. Jika waktu yang dibutuhkan lebih dari 10 menit, saya tidak menjalankan tes lebih lanjut.
Sangat menarik yang
g2
akhirnya menyusulg3
, meskipun tingkat konvergensi lebih lambat. Saya menduga ini karena operan tumbuh pada tingkat yang secara signifikan lebih lambat, menang dalam jangka panjang.g4_md
Implmentasi tercepat adalah sekitar 235x lebih cepat daripadag3_ref
implmentasi pada 500.000 digit. Yang mengatakan, masih ada overhead yang signifikan untuk streaming digit dengan cara ini. Menghitung semua digit secara langsung menggunakan Ramanujan 39 ( sumber python ) kira-kira 10x lebih cepat.Kenapa tidak Chudnovsky?
Algoritma Chudnovsky membutuhkan akar kuadrat presisi penuh, yang sejujurnya saya tidak yakin bagaimana cara kerjanya - dengan asumsi bisa saja sama sekali. Ramanujan 39 agak istimewa dalam hal ini. Namun, metode ini sepertinya kondusif untuk formula mirip Machin, seperti yang digunakan oleh y-cruncher, sehingga mungkin jalan yang layak dijelajahi.
sumber
Haskell, 231 byte
Ini menggunakan Algoritma Spigot Tidak Terbatas untuk Digit Pi oleh Jeremy Gibbons, 2004. Hasilnya adalah
p
. Secara teknis, ini harus mendukung urutan output yang tak terbatas, tetapi itu mungkin memakan waktu cukup lama (dan dibatasi oleh memori Anda).sumber
Python 2, 298 byte
Catatan, kode untuk menghasilkan pi diambil dari implementasi OP.
Upaya pertama saya bermain golf di Python. Output urutan selamanya.
sumber
π
sini? Anda, tentu saja, menghitung pi, kan?π
selamanya di sana?yield
yang menghentikannya, tapi saya tidak pandai pythonp
bagianPython 3.5,
278263 byte:Ini menerima
n
sebagai input untukn
digit pertamaπ
dan kemudian menampilkan anggota urutan dalamn
digit pertama . Sekarang, ini menggunakan modul desimal built-in Python untuk melampaui batasan floating-point Python, dan kemudian mengatur presisi, atau epsilon, sejauh apa pun input pengguna. Kemudian, untuk menghitungπ
, ini melewati 50 iterasi menggunakan algoritma Gausse-Legendre yang efisien , karena algoritma tampaknya menggandakan jumlah digit yang benar setiap kali, dan oleh karena itu, dalam 50 iterasi, kita bisa mendapatkan2^50
atau1,125,899,906,842,624
mengoreksi digit. Akhirnya, setelah perhitungan selesai, ia menggunakan ekspresi reguler dengan pemformatan string dalam satuwhile
lingkaran untuk menemukan dan mencetakre
mencocokkan objek (yang saya harap tidak apa-apa) untuk semua digit berulang 1 digit lebih lama dari pada iterasi sebelumnya melalui loop.Saya dapat menggunakan algoritma ini untuk berhasil dan akurat menghitung
π
hingga10,000,000
(sepuluh juta) digit, yang membutuhkan waktu sekitar 4 jam dan 12 menit untuk menyelesaikannya. Berikut ini adalah hasil akhir:Jadi, saya dapat dengan yakin mengatakan bahwa nomor 8 dalam urutan itu bahkan tidak muncul dalam 10 juta digit pertama!
π
adalah satu nomor acak ...sumber