Angka Bernoulli (khususnya, angka Bernoulli kedua) didefinisikan oleh definisi rekursif berikut:
Di mana menunjukkan kombinasi .
Diberikan integer nonnegatif m
sebagai input, menampilkan representasi desimal ATAU fraksi tereduksi untuk m
bilangan Bernoulli kedua. Jika Anda menghasilkan representasi desimal, Anda harus memiliki setidaknya 6 tempat desimal (digit setelah titik desimal), dan itu harus akurat ketika dibulatkan ke 6 tempat desimal. Misalnya, untuk m = 2
, 0.166666523
dapat diterima karena membulatkan ke 0.166667
. 0.166666389
tidak dapat diterima, karena membulatkan ke 0.166666
. Angka nol yang tertinggal dapat dihilangkan. Notasi ilmiah dapat digunakan untuk representasi desimal.
Berikut adalah input dan output yang diharapkan m
hingga dan termasuk 60, dalam notasi ilmiah dibulatkan ke 6 tempat desimal, dan sebagai pecahan tereduksi:
0 -> 1.000000e+00 (1/1)
1 -> 5.000000e-01 (1/2)
2 -> 1.666667e-01 (1/6)
3 -> 0.000000e+00 (0/1)
4 -> -3.333333e-02 (-1/30)
5 -> 0.000000e+00 (0/1)
6 -> 2.380952e-02 (1/42)
7 -> 0.000000e+00 (0/1)
8 -> -3.333333e-02 (-1/30)
9 -> 0.000000e+00 (0/1)
10 -> 7.575758e-02 (5/66)
11 -> 0.000000e+00 (0/1)
12 -> -2.531136e-01 (-691/2730)
13 -> 0.000000e+00 (0/1)
14 -> 1.166667e+00 (7/6)
15 -> 0.000000e+00 (0/1)
16 -> -7.092157e+00 (-3617/510)
17 -> 0.000000e+00 (0/1)
18 -> 5.497118e+01 (43867/798)
19 -> 0.000000e+00 (0/1)
20 -> -5.291242e+02 (-174611/330)
21 -> 0.000000e+00 (0/1)
22 -> 6.192123e+03 (854513/138)
23 -> 0.000000e+00 (0/1)
24 -> -8.658025e+04 (-236364091/2730)
25 -> 0.000000e+00 (0/1)
26 -> 1.425517e+06 (8553103/6)
27 -> 0.000000e+00 (0/1)
28 -> -2.729823e+07 (-23749461029/870)
29 -> 0.000000e+00 (0/1)
30 -> 6.015809e+08 (8615841276005/14322)
31 -> 0.000000e+00 (0/1)
32 -> -1.511632e+10 (-7709321041217/510)
33 -> 0.000000e+00 (0/1)
34 -> 4.296146e+11 (2577687858367/6)
35 -> 0.000000e+00 (0/1)
36 -> -1.371166e+13 (-26315271553053477373/1919190)
37 -> 0.000000e+00 (0/1)
38 -> 4.883323e+14 (2929993913841559/6)
39 -> 0.000000e+00 (0/1)
40 -> -1.929658e+16 (-261082718496449122051/13530)
41 -> 0.000000e+00 (0/1)
42 -> 8.416930e+17 (1520097643918070802691/1806)
43 -> 0.000000e+00 (0/1)
44 -> -4.033807e+19 (-27833269579301024235023/690)
45 -> 0.000000e+00 (0/1)
46 -> 2.115075e+21 (596451111593912163277961/282)
47 -> 0.000000e+00 (0/1)
48 -> -1.208663e+23 (-5609403368997817686249127547/46410)
49 -> 0.000000e+00 (0/1)
50 -> 7.500867e+24 (495057205241079648212477525/66)
51 -> 0.000000e+00 (0/1)
52 -> -5.038778e+26 (-801165718135489957347924991853/1590)
53 -> 0.000000e+00 (0/1)
54 -> 3.652878e+28 (29149963634884862421418123812691/798)
55 -> 0.000000e+00 (0/1)
56 -> -2.849877e+30 (-2479392929313226753685415739663229/870)
57 -> 0.000000e+00 (0/1)
58 -> 2.386543e+32 (84483613348880041862046775994036021/354)
59 -> 0.000000e+00 (0/1)
60 -> -2.139995e+34 (-1215233140483755572040304994079820246041491/56786730)
Implementasi referensi (dalam Python 3):
def factorial(n):
if n < 1:
return 1
else:
return n * factorial(n - 1)
def combination(m,k):
if k <= m:
return factorial(m)/(factorial(k) * factorial(m - k))
else:
return 0
def Bernoulli(m):
if m == 0:
return 1
else:
t = 0
for k in range(0, m):
t += combination(m, k) * Bernoulli(k) / (m - k + 1)
return 1 - t
Aturan
- Ini adalah kode-golf , jadi kode terpendek dalam byte menang
- Anda tidak boleh menggunakan fungsi apa pun, baik bawaan atau yang disertakan dalam perpustakaan eksternal, yang menghitung jenis nomor Bernoulli atau polinomial Bernoulli.
- Jawaban Anda harus memberikan output yang benar untuk semua input hingga dan termasuk 60.
Papan peringkat
Cuplikan Stack di bagian bawah posting ini menghasilkan leaderboard dari jawaban a) sebagai daftar solusi terpendek per bahasa dan b) sebagai leaderboard keseluruhan.
Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
## Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Contohnya:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:
## Perl, 43 + 2 (-p flag) = 45 bytes
Anda juga dapat membuat nama bahasa menjadi tautan yang kemudian akan muncul di cuplikan:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
Jawaban:
Julia,
2320 byteDisimpan 3 byte berkat Alex A.
Ini menggunakan rumus yang sama dengan solusi Mathematica saya dan solusi PARI / GP .
sumber
n->n>0?-zeta(1-n)n:1
zeta(n)
melempar kesalahan ketikan
bilangan bulat negatif. Saya menggunakan Julia 0.2.1 di linux.Mathematica,
40282322 byteMenggunakan rumus terkenal n * ζ (1− n ) = - B n , di mana ζ adalah fungsi Riemann Zeta .
Panjang yang sama:
Solusi asli, 40 byte, menggunakan fungsi pembangkit nomor Bernoulli .
sumber
Julia, 58 byte
Ini menciptakan fungsi rekursif
B
yang menerima bilangan bulat dan mengembalikanBigFloat
(yaitu titik mengambang presisi tinggi).Tidak Disatukan:
sumber
Minkolang 0,14 , 97 byte
Saya sebenarnya mencoba melakukannya secara rekursif dulu, tetapi penerjemah saya, seperti yang saat ini dirancang, sebenarnya tidak bisa melakukannya. Jika Anda mencoba untuk mengulang dari dalam untuk loop, itu memulai rekursi baru. Jadi saya pergi untuk pendekatan tabulasi ... yang memiliki masalah presisi. Jadi saya melakukan semuanya dengan fraksi. Tanpa dukungan bawaan untuk pecahan. [ menghela nafas ]
Coba di sini.Bonus: array memiliki semua fraksi untuk setiap nomor Bernoulli sebelumnya!
Penjelasan (sedikit)
Baris ketiga bertanggung jawab untuk
1/2
jikam
adalah 1 dan0/1
jikam
angka ganjil lebih besar dari 1. Baris kedua menghitungB_m
dengan rumus penjumlahan yang diberikan dalam pertanyaan, dan melakukannya sepenuhnya dengan pembilang dan penyebut. Kalau tidak, akan jauh lebih pendek. Paruh pertama dari baris pertama melakukan pembukuan dan memilih apakah akan mengeksekusi baris kedua atau ketiga, dan separuh kedua membagi pembilang dan penyebut dengan GCD mereka (jika ada) dan menyimpan nilai-nilai tersebut. Dan mengeluarkan jawaban di akhir.sumber
Python 2, 118 byte
Disimpan 6 byte karena xsot .
Disimpan
610 lebih karena Peter Taylor .Gunakan identitas berikut:
di mana A n adalah n th Alternating Nomor , yang dapat secara formal didefinisikan sebagai jumlah permutasi bolak pada satu set ukuran n , dibelah dua (lihat juga: A000111 ).
Algoritma yang digunakan pada awalnya diberikan oleh Knuth dan Buckholtz (1967) :
Python 2, 152 byte
Mencetak representasi pecahan yang tepat, yang diperlukan untuk nilai yang lebih besar dari 200 atau lebih.
sumber
range(2,n)
kerange(n-2)
Anda dapat mempersingkatn-k+1
untukn+~k
. Juga, apakah ada alasan Anda menggunakan>>1
bukan/2
? Terakhir, peningkatan sepele, tetapi Anda dapat menyimpan beberapa byte dengan aliasingrange
.>>1
dengan/2
.print+(n<1)or-(-1.)**(n+n/2)*n/(4**n-2**n)*a[n%2^1%n]
. Dan perhitungan dapat dilakukan untuk jumlah char yang sama sepertia=[1]*(n+1);exec"a=[(a[j-1]+a[j+1])*j/2for j in range(len(a)-1)];"*(n-1)
n+n/2
pintar; Saya tidak perlu dipilih, karena semua nilai ganjil lainnya adalah nol. Perhitungan alternatif sebenarnya 4 byte lebih pendek dengan bit inversi, tetapi juga jauh lebih lambat, karena beberapa alasan.range
dan melewatkan satu iterasi menjadi cara yang cerdas untuk mempersingkat inisialisasi. Cara Anda sekarang membagi indeks genap dan ganjil sangat bagus, dan memungkinkan penghematan lebih lanjut dengan menarik tanda ke dalam definisia
:a=[(-1)**(n/2),n<2]*n
. Maka nilai baliknya adalah+(n<1)or-n/(2.**n-4**n)*a[1]
. Anda juga mendapat tanda titik koma di akhir baris 2.PARI / GP,
5223 byteMenggunakan rumus terkenal n * ζ (1− n ) = - B n , di mana ζ adalah fungsi Riemann Zeta .
Solusi asli, 52 byte, menggunakan fungsi pembangkit nomor Bernoulli .
sumber
zeta
fungsi dihitung menggunakan angka Bernoulli.bernfrac
danbernreal
masing-masing 8 byte dan mereka sudah berfungsi, jadi tidak perlun->
. Tapi +1 untuk solusi yang bagus.Python 3, 112 byte
Edit: Saya membersihkan jawaban ini. Jika Anda ingin melihat semua cara lain yang saya pikirkan untuk menjawab pertanyaan ini dengan Python 2 dan 3, lihat revisi.
Jika saya tidak menggunakan tabel pencarian (dan saya menggunakan memoisasi), saya berhasil mendapatkan definisi rekursif hingga 112 byte! MERAYU! Perhatikan bahwa
b(m)
mengembalikan aFraction
. Seperti biasa, jumlah byte dan tautan untuk pengujian .Dan fungsi yang menggunakan tabel pencarian, dan mengembalikan seluruh tabel fraksi dari
b(0)
hinggab(m)
, inklusif.sumber
1.
bukan1.0
..0
daris
seluruhnya, karena akan cepat menjadi pelampung nantinya.p=v=1;exec('[...];p+=1'*k)
sebagai ganti loop terdalam Anda?CJam,
69 49 3433 byteDemo online
Terima kasih kepada Cabbie407 , yang jawabannya membuat saya sadar akan algoritma Akiyama-Tanigawa.
Pembedahan
sumber
PARI / GP, 45 byte
Menggunakan rumus yang sama dengan jawaban Python saya , dengan A n dihasilkan melalui polylog.
Skrip Tes
Jalankan
gp
, pada prompt tempelkan yang berikut:sumber
Mathematica,
524842 byteFungsi tanpa nama yang menggunakan definisi literal.
sumber
Sign@#
perlu?Sign@#
, masih mengembalikan jawaban yang benar untuk 0.Python 2,
132130 byteIni hanya versi golf dari implementasi referensi.
Ini agak lambat dalam praktiknya, tetapi dapat dipercepat secara signifikan dengan memoisasi:
Anda dapat mencoba versi ini secara online di Ideone .
sumber
gawk4, 79 byte
77 byte kode + 2 byte untuk
-M
flagIni merupakan implementasi dari algoritma Akiyama-Tanigawa dari halaman Wikipedia.
Mengalami masalah dengan "6-desimal-digit-rule", karena ini mencetak seluruh angka dan kemudian 6 digit, tetapi tidak ada daftar di sini untuk membandingkan hasilnya.
Kelemahannya adalah ini mencetak tanda minus di depan
0.000000
banyak kali, tapi saya tidak berpikir itu salah.Contoh penggunaan
Output dari 0 hingga 60
sumber
printf"%e"
bekerja0.00000
s hanya sangat kecil dan tidak benar-benar nol.GolfScript, 63 byte
Demo online .
Menggunakan rumus yang sama dengan jawaban Python saya .
Skrip Tes
Tautan apphb akan kehabisan waktu untuk hal ini. Jika Anda belum menginstal GolfScript secara lokal, saya sarankan menggunakan juru bahasa anarki golf (gunakan formulir, pilih GolfScript, tempel, kirim).
sumber
Perl, 101 byte
Menghitung shebang sebagai tiga, input diambil dari stdin.
Menggunakan rumus yang sama dengan jawaban Python saya .
Contoh Penggunaan
Demo online .
sumber
R, 93 byte
Tidak terlalu orisinal sebagai solusi. Jika ada komentar, silakan saja!
Tidak Terkumpul:
sumber
if
/else
pernyataan dan menggunakanm>0
serta mengulangi sebagai1:m-1
gantinya.Sebenarnya ,
4645 byte (tidak bersaing)Saya sudah bermaksud melakukan jawaban Serius / Sebenarnya selama berbulan-bulan dan sekarang saya bisa. Karena ini menggunakan perintah yang tidak dimiliki oleh Serius pada bulan November 2015, itu tidak bersaing. Saran bermain golf diterima.Cobalah online!
Edit: Pada bulan Februari 2017, ada pembaruan untuk Actually yang mengubah fungsi literal mana. Biasanya, ini tidak akan bersaing untuk tantangan yang ditulis sebelum Februari, tetapi karena jawaban ini sudah tidak bersaing, saya tetap mengedit jawaban ini. Nikmati.
Ini menggunakan definisi eksplisit nomor Bernoulli di Wikipedia.
Tidak melakukanolf
sumber
Ruby,
6661 byteIni adalah versi Ruby dari jawaban Python saya.
Karena ini menggunakan
Rational
dalam jawabannya, saya cukup yakin ini berfungsi hingga 60, tapi saya mengalami kesulitan menjalankan bahkanb[24]
, jadi saya menerapkan tabel pencarian lagi untuk868180 byte.sumber
J, 10 byte
Menghitung angka Bernoulli ke- n dengan menemukan koefisien ke- n dari fungsi pembangkit eksponensial x / (1 - e -x ).
Pemakaian
Jika input diberikan integer atau float sebagai argumen, itu akan menampilkan float. Jika diberi bilangan bulat yang diperluas, ditandai dengan akhiran
x
, itu akan menghasilkan bilangan bulat yang diperluas atau yang rasional, dua bilangan bulat yang diperpanjang dipisahkan olehr
.Penjelasan
sumber
Aksioma,
134147 byteungolf dan tes
sumber
APL (NARS), 83 karakter, 166 byte
Input sebagai output integer sebagai rasional besar
sumber
Haskell, 95 byte
Ini mengimplementasikan definisi eksplisit nomor Bernoulli yang diuraikan di halaman Wikipedia .
sumber
Perl 6, 83 byte
Solusi 114 byte yang lebih cepat:
sumber
Javascript, 168 byte
Setel variabel 'k' ke nomor Bernoulli yang Anda inginkan, dan hasilnya adalah c [0] di atas [0]. (pembilang & penyebut)
Contoh Penggunaan
Tidak sekecil yang lain, tetapi satu-satunya yang saya tulis yang mendekati. Lihat https://marquisdegeek.com/code_ada99 untuk upaya (non-golf) saya yang lain.
sumber
Aksioma, 57 byte
kode untuk pengujian dan hasil
kita harus perhatikan bahwa fungsinya bukan yang seseorang tulis di atas tetapi
t*%e^t/(%e^t-1))
dengan% e Euler costantsumber
Pyth , 22 byte
Cobalah online!
Menentukan fungsi yang disebut sebagai
y<number>
, misyQ
.sumber