Sebagai lanjutan dari estimasi Monte Carlo tentang Pi , tantangan ini adalah menghasilkan kode terpendek untuk Pi konstan. Kecuali di sini, kode Anda harus menampilkan digit pi berturut-turut selamanya.
Ini adalah kode golf, jadi pengiriman terpendek (dalam byte) menang kecuali bahwa ia harus menampilkan 10.000 digit pertama dalam waktu kurang dari 10 detik pada PC yang masuk akal dan tidak boleh diakhiri.
Anda tidak dapat menggunakan built-in untuk fungsi Pi atau trigonometri.
Menghapus batas keras pada ukuran kode.
3141...
adalah itu - digit pi berurutan.Jawaban:
CJam - 48
Ini menghitung π sebagai 2 * jumlah (k! / (2k + 1) !!) dengan presisi yang lebih besar dan lebih besar dan pada setiap langkah mencetak sekelompok angka dari tempat sebelumnya.
Anda dapat mencoba online versi modifikasi yang hanya melakukan 8 (loop luar) iterasi dan mencetak 512 digit, atau menggunakan penerjemah java untuk hal yang nyata. Di laptop saya, ia mencapai 16384 digit dalam waktu sekitar 6 detik.
Catatan: program ini sangat haus akan memori; versi yang berperilaku lebih baik tetapi sedikit lebih lama adalah:
Penjelasan:
sumber
Python, 138 byte
Implementasi http://www.cs.ox.ac.uk/jeremy.gibbons/publications/spigot.pdf .
sumber
GolfScript (81 karakter)
Demo online (itu jauh lebih lambat dari desktop yang masuk akal, dan memiliki perubahan kode sepele untuk mengulang beberapa kali hingga).
Saya, tentu saja, menggunakan algoritma keran yang saya sebutkan di komentar sebelumnya, tetapi butuh beberapa saat untuk menyesuaikannya dengan kepuasan saya. Algoritma seperti yang disajikan dalam makalah Gibbons adalah (pseudocode)
GolfScript di atas setara dengan (pseudocode)
yang menyimpan beberapa karakter dalam inisialisasi dan manajemen tumpukan.
sumber
Pyth -
8785 byteTerjemahan lain dari http://www.cs.ox.ac.uk/jeremy.gibbons/publications/spigot.pdf . Saya akan melakukan Python tetapi @orlp mengalahkan saya untuk itu, jadi saya melakukan Pyth. Cukup kecil untuk muat dalam tweet.
Ini memberikan output ke stdout, meskipun dalam langkah-langkah intermiten karena buffer cetak yang berasal dari pengaturan
end=""
cetak. Saat ini saya tidak mencetak titik desimal karena spec mengatakan "digit berurutan". Ini adalah tugas yang membunuh nilaiku.Coba di sini . (Catatan: Karena penerjemah online hanya memberikan hasil yang selesai, infinite loop keluar, sehingga hanya mencetak 100 yang menambah ukuran kode. Untuk mencoba infinite, unduh penerjemah lokal.)
Pengaturan waktu
Di google cloud saya menghitung instance mikro, menurut gnu waktu yang dibutuhkan:
real: 0m2.062s
jadi itu jelas cukup cepat.sumber
Scala, 599 byte
Kode di bawah ini adalah port langsung dari kode Pascal dari Lampiran 2 dari Algoritma Spigot untuk Digit Pi . Jelas sangat sedikit golf belum dilakukan. Kode tidak menghasilkan 10.000 digit dalam waktu kurang dari 10 detik dengan
piSpigot(10000)
dan jika seseorang memiliki memori tak terbatas dapat diparameterisasi untuk menghasilkan banyak digit, tetapi tidak terbatas. Saya tidak yakin apakah ini memenuhi kendala masalah, jadi silakan berikan umpan balik.sumber
n
. Lihat misalnya cs.ox.ac.uk/people/jeremy.gibbons/publications/spigot.pdfBefunge-98 (PyFunge), 120 byte
Cobalah online!
Ini adalah batas dalam hal timelimit. 10.000 digit memakan waktu sekitar 11 detik di laptop saya, tapi saya yakin pasti ada PC yang "masuk akal" yang bisa melakukannya lebih cepat dari itu.
Namun, jika Anda mencobanya di TIO, perhatikan bahwa itu tidak akan mengembalikan apa pun hingga mencapai batas waktu 60 detik, karena algoritma ini dirancang untuk terus berjalan selamanya. Pada saat itu Anda akan memiliki lebih dari 10.000 digit.
Saya menggunakan algoritma keran Jeremy Gibbons, yang menurut saya sama dengan sebagian besar jawaban lain di sini. Namun, perhatikan bahwa ini bergantung pada juru bahasa yang memiliki sel-sel memori presisi yang sewenang-wenang, dan satu-satunya implementasi yang saya ketahui yang mendukungnya adalah PyFunge .
Penjelasan
sumber