Semua orang tahu pi konstanta matematika, rasio keliling lingkaran terhadap diameternya.
3.14159265358979323846264338327950288419716939937510...
Anda mungkin juga tahu e konstan matematika, dasar dari logaritma natural.
2.71828182845904523536028747135266249775724709369996...
Tapi ... apakah kamu tahu pie ? Ini adalah salah satu konstanta terpenting (bagi saya). Ini adalah digit pi dan e yang disisipkan.
32.1741185298216852385485997094352233854366206248373...
Sebagai ekspansi desimal:
3, 2, 1, 7, 4, 1, 1, 8, 5, 2, 9, 8, 2, 1, 6, 8, 5, 2...
Ini adalah urutan OEIS A001355 .
KATA KUNCI: bukan, basis, bodoh , mudah
Itu adalah urutan yang sangat bodoh.
Tantangan
Tulis sebuah program / fungsi yang mengambil bilangan bulat n-negatif dan mengeluarkan digit n pie .
Spesifikasi
- Aturan I / O standar berlaku .
- Celah standar yang dilarang .
- Solusi Anda harus bekerja untuk setidaknya 50 digit dari setiap konstanta yang berarti harus bekerja setidaknya untuk 100 syarat urutan (tolong, cobalah untuk tidak hardcode: P).
- Output untuk 2 atau 3 bukan titik desimal .
- Solusi Anda dapat diindeks 0 atau diindeks 1 tetapi harap tentukan yang mana.
- Tantangan ini bukan tentang menemukan pendekatan terpendek dalam semua bahasa, melainkan tentang menemukan pendekatan terpendek dalam setiap bahasa .
- Kode Anda akan dinilai dalam byte , biasanya dalam pengkodean UTF-8, kecuali ditentukan lain.
- Fungsi built-in yang menghitung urutan ini diperbolehkan tetapi termasuk solusi yang tidak bergantung pada built-in dianjurkan.
- Penjelasan, bahkan untuk bahasa "praktis", dianjurkan .
Uji kasus
Ini adalah 0-diindeks.
Input Output
1 2
2 1
11 8
14 6
21 4
24 9
31 5
Dalam beberapa format yang lebih baik:
1 2 11 14 21 24 31
1, 2, 11, 14, 21, 24, 31
2 3 12 15 22 25 32
2, 3, 12, 15, 22, 25, 32
dumb
berarti tidak menarik tanpa properti yang spesial.pei
, bukanpie
Jawaban:
Mathematica, 50 byte
1-diindeks
sumber
Riffle
, tetapi solusi saya muncul satu byte pendek:RealDigits[If[OddQ@#,Pi,E],10,#][[1,Ceiling[#/2]]]
&Haskell,
154147146 bytes, TANPA HARDCODING ATAU PENGGUNAAN KONSTAN BUILTINSolusi ini menghitung e dan pi menggunakan seri infinite dan menyimpannya dalam bilangan bulat fixed-point presisi sewenang-wenang (
Integer
tipe bawaan Haskell danRational
ekstensinya).Tidak Disatukan:
Diindeks 0. Akurat untuk input 0-99, tidak akurat untuk input 100-101, di luar batas sebaliknya.
Penjelasan:
Hitung pi menggunakan seri tak hingga ini . Menghitung e menggunakan seri faktorial invers klasik . Secara teoritis ini bukan formula ideal untuk digunakan, karena mereka tidak terlalu singkat dalam hal bytecount, tetapi mereka adalah satu-satunya yang saya dapat menemukan bahwa konvergensi cukup cepat untuk membuat verifikasi akurasi layak (jumlah lain diperlukan ratusan ribu jika bukan jutaan istilah). Dalam versi golf, e dihitung dengan presisi yang jauh lebih tinggi dari yang diperlukan untuk meminimalkan bytecount. Kedua konstanta dihitung sedikit lebih banyak dari yang diperlukan untuk menghindari kesalahan pembulatan (yang bertanggung jawab atas canggung nilai yang salah).
Konstanta dihitung sebagai rasio integer presisi sewenang-wenang (
Rational
), kemudian dikalikan dengan 10 ^ 50 sehingga semua digit yang diperlukan tetap utuh ketika rasio dikonversi ke integer (presisi sewenang-wenang) (Integer
). Ini juga menghindari masalah menghindari titik desimal dalam representasi string angka, yang fungsinya secara alternatif menarik karakter.sumber
Taksi , 749 byte
Cobalah online!
Mencoba menghitung pi atau e secara terprogram dalam Taxi akan menjadi mimpi buruk, walaupun saya yakin itu bisa dilakukan. Dengan demikian, jauh lebih pendek untuk hanya melakukan hardcode 100 digit pertama dalam urutan. Rasanya cukup murah tapi jelas kode taksi terpendek yang memenuhi tantangan.
Hard-mengkode urutan sebagai string, menerima
n
, kemudian beralihn
ke bawah dan menghapus karakter pertama dalam string setiap kali. Kapann=0
, menampilkan karakter pertama. Ini satu-diindeks.Tidak di-golf / diformat:
sumber
Python 2 , 88 byte
-4 byte berkat ide konversi dasar dari @EriktheOutgolfer .
Cobalah online!
Python 2 + sympy , 92 byte
Diindeks 0. Terima kasih kepada Rod untuk mengingatkan saya untuk beralih
from sympy import*
, yang sebelumnya saya lupa.Cobalah online!
Python 2 , 114 byte
Jujur saya pikir solusi terpendek adalah hardcoding, karena Python tidak memiliki built-in yang berguna.Cobalah online!
Python 2 , 114 byte
Solusi Setara dengan @totallyhuman .
Cobalah online!
sumber
05AB1E , 10 byte
Penjelasan:
Diindeks 0.
Cobalah online!
sumber
žt
itu bukan daftar yang tidak terbatas, itulah sebabnya Okx menggunakan 100 digit pertama e dalam programnya. Mengubahnya ke versi baru 05AB1E (di mana pi dan e adalah daftar tanpa batas) masih tidak akan berfungsi dalam versi Anda saat ini, karena zip akan membuat pasangan danJ
oin akan bergabung dengan pasangan itu alih-alih semuanya. 9 byte masih mungkin dengan menggantiJ
denganS
dalam versi baru, di manaS
membuatnya menjadi daftar karakter / angka yang rataPython 3 ,
8380 byteDiindeks 0.
Cobalah online!
Ada beberapa karakter yang tidak dapat dicetak di sana yang tidak dapat dilihat dengan benar di browser.
Ini bekerja dengan membangun tupel
(32, 17, 41, 18, 52, ...)
dari kode ASCII dari karakter dalam bycested hardcoded. Tuple dikonversi ke string'3217411852...'
, dari mana kita memilih digit yang tepat.sumber
Polyglot, 108 byte
Bekerja di:
Saya pikir ini adalah yang terpendek yang dapat Anda lakukan dalam C # melihat karena ini adalah 252 byte untuk menemukan desimal kesatu pi .
sumber
Java 8,
420417413404380358 (dihitung) &115110 (hardcoded) byteDihitung (
420417413404380358 ):Coba di sini.
Buktikan output hasil yang benar untuk 100 item yang diperlukan.
Hardcoded: (
115110 byte ):Cobalah online.
Diindeks 0
-9 dan -5 byte berkat @Nevay .
-24 byte terima kasih kepada @ceilingcat .
Anda sudah memintanya ..;)
Built-in Java
Math.PI
danMath.E
dobel, yang memiliki ketepatan maksimal hanya 16. Oleh karena itu, kita harus menghitung sendiri nilai yang kita gunakanjava.math.BigInteger
dan / ataujava.math.BigDecimal
.Karena saya sudah menghitung PI sebelumnya dalam tantangan lain , saya menggunakan kode yang sama menggunakan
BigInteger
. Algoritma untuk nomor Euler menggunakanBigDecimal
namun.Hasilnya
p
dane
oleh karena itu:31415...
dan2.718...
.Mungkin bisa golf dengan hanya menggunakan
BigDecimal
, tetapi memberikan beberapa jawaban yang salah untuk PI, jadi saya sekarang menggunakan keduanyaBigDecimal
danBigInteger
.Penjelasan:
sumber
(d+=2)
menjadi++d
danreturn p%10+1
menjadi adilreturn p%10
.You've asked for it.. ;)
Hei, aku suka yang pertamamu lebih baik. Saya mendapat jawaban yang lebih sulit daripada yang saya harapkan ...charAt(n+1>>1)
dan 5 byte dalam versi hardcode Anda dengan menggunakan referensi metode"..."::charAt
.Seed , 6015 byte
Seed setara dengan jawaban Befunge saya. Seperti yang saya sebutkan di sana, program Befunge keluaran ini tidak berfungsi pada TIO karena TIO tampaknya memiliki garis pembungkus internal 80 karakter.
sumber
Excel, 113 byte
1-diindeks
PI()
hanya akurat hingga 15 digit. Mirip denganEXP(1)
.60solusi 42 byte yang berfungsi untuk Input<=30
(-18 bytes berkat @Adam)sumber
if(...)
pernyataan:. Tidak=MID(IF(ISODD(b1),PI(),EXP(1)/10)/10,b1/2+3,1)
dapat menyiasati ketidaktepatanpi()
danexp()
, meskipun05AB1E , 13 byte
Cobalah online!
Mirip dengan jawaban Magic, tetapi agak berbeda.
Penjelasan:
sumber
Python 2 + SymPy ,
7063 byteCobalah online!
sumber
Japt , 55 byte
Uji secara online! Berisi beberapa unsintables.
Berfungsi dengan mengganti setiap karakter dalam string dengan charcode-nya, lalu mengembalikan digit pada indeks yang benar. String dihasilkan oleh program ini:
Uji secara online!
sumber
Julia, 63 byte
1-diindeks
Mengubah pi atau e menjadi string, menghilangkan tempat desimal, dan kemudian memanggil digit yang sesuai. Mengembalikan representasi karakter digit.
sumber
Seed,
58525794Berdasarkan jawaban TehPers Befunge.
sumber
Malbolge Unshackled (varian rotasi 20-trit), 3,64E6 byte
Ukuran jawaban ini melebihi ukuran program maksimum yang dapat diposkan (eh), sehingga kode ini berada di repositori GitHub saya (catatan: Jangan menyalin kode menggunakan CTRL + A dan CTRL + C, cukup klik kanan dan klik "Simpan elemen tujuan sebagai. .. ").
Bagaimana cara menjalankannya?
Ini mungkin bagian yang sulit, karena juru bahasa Haskell yang naif akan membutuhkan waktu lama untuk menjalankannya. TIO memiliki penerjemah Malbogle Unshackled yang layak, tetapi sayangnya saya tidak dapat menggunakannya (batasan).
Yang terbaik yang bisa saya temukan adalah varian lebar rotasi 20-trit, yang berkinerja sangat baik, menghitung (cukup banyak) secara instan .
Untuk membuat penerjemah sedikit lebih cepat, saya telah menghapus semua cek dari penerjemah Malbolge Unshackled milik Matthias Lutter.
sumber
05AB1E , 14 byte
Cobalah online!
Jawaban ini diindeks 0.
sumber
'.K
keþ
dan menghapus<
. (Tidak yakin mengapa Anda bahkan memasukkan<
, karena Anda menyatakan jawaban Anda diindeks 0. Jawaban Anda saat ini adalah 1-diindeks dengan<
.),
sejak zip melakukan ini secara implisit, tapi saya melihat itu hampir persis sama dengan jawaban 10-byte lainnya ..Python 3 + SymPy , 109 Bytes
Diindeks 0 Cobalah secara online!
Kalahkan hardcoding sebanyak 5 byte !! Tapi mungkin bisa lebih baik. Tetapi mengalahkan hardcoding membuat saya merasa senang :)
sumber
Pyth, 35 byte
Suite uji
Karena Pyth tidak memiliki konstanta pi dan e konstanta yang acak, saya menghitungnya secara langsung.
Menghitung pi:
Kegunaan ini terulangnya berikut terus fraksi ke pi menghitung:
2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...))))
. Saya mendapatkannya dari jawaban PPCG lain . Ini diturunkan dalam persamaan 23-25 di sini .Saya menghitungnya dari dalam ke luar, menghilangkan semua istilah di luar 1024, karena istilah selanjutnya memiliki sedikit efek pada angka, dan saya mempertahankan 99 digit presisi untuk memastikan 50 pertama benar.
Menghitung e:
Saya menjumlahkan kebalikan dari angka 1024 pertama, hingga 99 digit presisi.
Lalu, saya mengonversi kedua angka menjadi string, menjalinnya, dan mengindeks.
sumber
MATLAB, 93 Bytes
Penjelasan sederhana adalah bahwa ini pertama-tama mengubah e dan pi menjadi string, kemudian melewati for for yang menyatukan digit. Di sini, c adalah pai, p adalah pi, dan e adalah e.
Saya juga telah memecah ini menjadi beberapa baris untuk dibaca, tetapi kode yang sebenarnya adalah semua pada satu baris dengan spasi minimal.
sumber
n
,, itu akan menghasilkannth
digit urutan Pie. Anda juga dapat mengurangi bytecount Anda dengan mengurangi nama variabel Anda menjadi satu karakterinput('')
sebagai penggantiinput('n')
C # + BigDecimal ,
377372 byteDisimpan 5 byte berkat @Kevin Cruijssen.
Tidak ada tautan TIO karena perpustakaan eksternal, sayangnya C # tidak memiliki built in
BigDecimal
class sehingga yang eksternal ini harus dilakukan. Mungkin beberapa golf masih mungkin tetapi tidak ada waktu sekarang.Versi Lengkap / Diformat:
sumber
x[j++]/e
di sekitarc=(x[j++]/e)*n
untuk -2 byte; Juga, saya pikir Anda dapat menghapus keduanya+""
di dua pernyataan kembali dan mengembalikan int bukan string, dan kemudian menambahkan-48
pernyataan kembali kedua untuk mengkonversi char ke output int (untuk -1 byte).Python 2 , 82 byte
Cobalah online!
Berisi beberapa karakter ASCII yang tidak dapat dicetak. flornquake menyelamatkan dua byte.
sumber
lambda n:('%02d'%ord('...'[n/2]))[n%2]
, meskipun mungkin ada sesuatu yang lebih baik.brainfuck , 402 byte
Cobalah online!
Masukan sebagai kode karakter (mis. "A" = 65)
Cobalah online dengan input digit!
kode:
sumber
Neim , 45 byte
neim tidak dibuat untuk angka desimal
Cobalah online!
sumber
Befunge , 105 byte
Tidak berfungsi pada TIO karena sepertinya membungkus garis secara internal pada 80 karakter untuk beberapa alasan. Anda bisa membuatnya bekerja di TIO dengan meletakkan setiap digit pada baris baru, dan memiliki
&0g,@
setelah3
di baris pertama.sumber
JavaScript (ES6) + mathjs , 78 byte
Nol diindeks dan berfungsi hingga 128 angka (input maksimal 127).
Cuplikan Tes
sumber
MATLAB (dengan Kotak Alat Simbolik),
8982 byteDengan memanfaatkan Symbolic Toolbox, jawaban ini memberikan output tanpa hardcoding nilai pi dan e.
Sebagai bonus yang menyenangkan kode ini sebagai input dapat mengambil satu indeks, atau array indeks dan secara bersamaan akan memberikan nilai output untuk semua nilai indeks yang disediakan (mis. Memberikan 1:10 akan menampilkan 10 nilai pertama).
(baris baru ditambahkan untuk dibaca, tidak diperlukan untuk eksekusi sehingga tidak termasuk dalam jumlah byte)
Sayangnya versi Oktaf yang digunakan oleh TIO tidak mendukung input simbolik ke
vpa
fungsi ini, jadi tidak dapat memberikan tautan TIO.Dalam MATLAB pengindeksan ke vektor kembali dari suatu fungsi tidak mungkin dengan cara yang sama seperti dengan Oktaf yang berarti ini adalah program lengkap daripada hanya fungsi anonim. Program akan meminta input
n
selama eksekusi - ini adalah nilai satu indeks untuk elemen yang diperlukan. Pada akhir program, nilai dicetak secara implisit.Untuk program kami menggunakan
vpa
fungsi yang memberikan nilai desimalpi
danexp(1)
(e) ke 51 desimal . Ini dilakukan secara simbolis untuk memungkinkan ketepatan teoretis tanpa batas. Untuk memperluas lebih dari 100 elemen, cukup tambahkan nilai51
dalam kode untuk meningkatkan rentang.Wrapping
vpa
inchar
(iechar(vpa(...))
) diperlukan untuk mengonversi output fungsi menjadi string daripada nilai simbolik. Output yang dihasilkan adalah string:Ini termasuk e dan pi hingga 51 tempat desimal - cukup untuk memungkinkan 100 digit output kami (kami harus melakukan sedikit tambahan dp daripada yang diperlukan untuk menghindari mencetak nilai bulat)
Untuk mengindeks kekacauan ini, kita harus setidaknya menyingkirkan titik desimal sehingga kedua digit angka tersebut bersebelahan. Awalnya saya menggunakan penggantian regex sederhana apa pun yang bukan digit tanpa apa-apa. Namun saya dapat menyimpan 7 byte dengan hanya menghilangkan titik desimal menggunakan kode:
string yang dihasilkan sekarang:
Ini berisi semua digit yang kita butuhkan dengan potongan pi dan e dalam indeks berurutan.
Kami kemudian dapat mengonversi indeks yang disediakan sehingga bilangan ganjil mengakses ch pi dan bahkan bilangan akses e chunk menggunakan perhitungan:
Mengakses indeks (indeks) tersebut dalam string di atas akan memberikan output yang benar.
sumber
Aksioma, 148 byte
0 array berbasis. Hasil
sumber
Google Sheets, 47 Bytes
Fungsi Lembar Kerja Anonim yang mengambil input dari sel
A1
dan menampilkan digit Pie tersebut ke sel panggilanVersi Hardcoded, 112 Bytes
Versi ini sepenuhnya memenuhi spesifikasi program, tetapi umumnya tidak menyenangkan.
Fungsi Lembar Kerja Anonim yang mengembalikan digit ke-n dalam daftar pie yang diindeks 1
sumber
BFASM , 142 byte
Mengambil input sebagai karakter ascii, memberikan output dalam bentuk digit.
sumber