Sebuah jumlah Bell ( Oei A000110 ) adalah sejumlah cara untuk partisi satu set n berlabel (berbeda) elemen. Nomor Bell 0 didefinisikan sebagai 1.
Mari kita lihat beberapa contoh (saya menggunakan tanda kurung untuk menunjukkan subset dan kurung untuk partisi):
1: {1}
2: {[1,2]}, {[1],[2]}
3: {[1,2,3]}, {[1,2],[3]}, {[1,3],[2]}, {[2,3],[1]}, {[1],[2],[3]}
Ada banyak cara untuk menghitung nomor Bell, dan Anda bebas untuk menggunakannya. Satu cara akan dijelaskan di sini:
Cara termudah untuk menghitung nomor Bell adalah dengan menggunakan segitiga nomor yang menyerupai segitiga Pascal untuk koefisien binomial. Nomor Bell muncul di tepi segitiga. Dimulai dengan 1, setiap baris baru dalam segitiga dibangun dengan mengambil entri terakhir di baris sebelumnya sebagai entri pertama, dan kemudian mengatur setiap entri baru ke tetangga kirinya ditambah tetangga kiri atas:
1
1 2
2 3 5
5 7 10 15
15 20 27 37 52
Anda dapat menggunakan pengindeksan 0 atau pengindeksan 1. Jika Anda menggunakan pengindeksan-0, sebuah input 3
harus di-output 5
, tetapi harus di-output 2
jika Anda menggunakan pengindeksan-1.
Program Anda harus bekerja hingga nomor Bell 15, mengeluarkan 1382958545
. Secara teori, program Anda harus dapat menangani angka yang lebih besar (dengan kata lain, jangan membuat hardcode solusinya).
EDIT: Anda tidak diharuskan untuk menangani input 0 (untuk pengindeksan 0) atau 1 (untuk pengindeksan 1) karena tidak dihitung dengan metode segitiga.
Kasus uji (dengan asumsi 0-indexing):
0 -> 1 (OPTIONAL)
1 -> 1
2 -> 2
3 -> 5
4 -> 15
5 -> 52
6 -> 203
7 -> 877
8 -> 4140
9 -> 21147
10 -> 115975
11 -> 678570
12 -> 4213597
13 -> 27644437
14 -> 190899322
15 -> 1382958545
Jawaban menggunakan metode bawaan (seperti BellB [n] dalam Bahasa Wolfram) yang secara langsung menghasilkan nomor Bell akan menjadi tidak kompetitif.
Kode terpendek (dalam byte) menang.
3
harus menampilkan5
Ini akan keluar15
, kan? Dan dengan 1-pengindeksan itu akan menampilkan5
3
harus keluar2
. Lalu apa yang akan input1
berikan dengan pengindeksan 1?Jawaban:
Jelly , 9 byte
Ini menggunakan rumus
yang ditutup setiap kali n <2 .
Cobalah online!
Bagaimana itu bekerja
sumber
JavaScript (ES6), 47 byte
Yang pertama diindeks 0, kedua diindeks.
sumber
Haskell, 36 byte
Menggunakan metode segitiga, dengan benar menangani 0, 0 berbasis.
sumber
R , 31 byte
menggunakan rumus Stirling Number dari Jenis Kedua dan menghitung angka-angka itu dengan paket gmp ; membaca dari stdin dan mengembalikan nilainya sebagai Big Integer; gagal untuk 0; 1-diindeks.
sumber
Mathematica, 24 byte
-13 byte dari @Kelly Lowder!
sumber
Sum[k^#/k!,{k,0,∞}]/E&
hanya 24 byteJelly ,
141211 byteCobalah online!
Tidak tepat mengenai titik kuat Jelly dengan
input dinamis¡
,Ṫ
selalu memodifikasi array dan kurangnya atom yang saling bergantung (satu byte;@
atau sebaliknyaṭ
).sumber
CJam (19 byte)
Demo online
Pembedahan
sumber
MATL , 14 byte
Input berbasis 0. Cobalah online!
Penjelasan
Ini menggunakan rumus
di mana p F q ( a 1 , ..., a p ; b 1 , ..., b q ; x ) adalah fungsi hypergeometric umum .
sumber
Python , 42 byte
Cobalah online!
Rumus rekursif berasal dari menempatkan
n
elemen ke dalam partisi. Untuk setiap elemen pada gilirannya, kami memutuskan apakah akan menempatkannya:k
pilihank
untuk elemen masa depanEither way mengurangi jumlah
n
elemen yang tersisa untuk ditempatkan. Jadi, kami memiliki rumus rekursiff(n,k)=k*f(n-1,k)+f(n-1,k+1)
danf(0,k)=1
, denganf(n,0)
nomor Bell ke-n.sumber
Python 2 , 91 byte
Cobalah online!
B (n) dihitung sebagai jumlah angka Stirling dari jenis kedua.
sumber
s
: karena panggilan rekursif selalu berkurangn
dan tidak ada pembagian olehk
Anda dapat kehilangan*k
dalam istilah pertama.B=lambda n,r=[1,0]:n and B(n-1,[k*r[k]+r[k-1]for k in range(len(r))]+[0])or sum(r)
B
tidak rekursif dan itu adalah jawaban akhir Anda, Anda dapat menghilangkanB=
untuk menyimpan 2 byteMATLAB,
128103 byteCukup jelas. Menghilangkan titik koma di akhir baris akan mencetak hasilnya.
25 byte disimpan berkat Luis Mendo.
sumber
R , 46 byte
Cobalah online!
sumber
T
default keTRUE
(alias 1) kecuali sudah disetel di tempat lainMATL ,
1918 byteMenggunakan input berbasis 0. Berdasarkan hubungan perulangan
Cobalah online!
sumber
Ohm , 15 byte
Cobalah online!
Menggunakan forumla Dobinski (bahkan berfungsi untuk B (0) yay ).
Penjelasan
sumber
Python (79 byte)
Demo online di Python 2, tetapi juga berfungsi di Python 3.
Ini membangun segitiga Aitken menggunakan lambda rekursif untuk loop golf.
sumber
Haskell , 35 byte
Cobalah online!
Formula dijelaskan dalam jawaban Python saya .
sumber
J, 17 byte
Menggunakan metode perhitungan segitiga.
Cobalah online!
Penjelasan
sumber
Python 3 , 78 byte
Saya memutuskan untuk mencoba dan menempuh rute berbeda untuk perhitungan. Ini menggunakan rumus Dobinski, diindeks 0, tidak berfungsi untuk 0.
Cobalah online!
sumber
f
tidak berulang, Anda dapat menghilangkanf=
dan menyimpan 2 bytePython 3 ,
6860 byteKonstruksi segitiga rekursif yang sederhana, tetapi sangat tidak efisien untuk tujuan praktis. Menghitung hingga nomor Bell ke-15 menyebabkan TIO kehabisan waktu, tetapi berfungsi pada mesin saya.
Ini menggunakan pengindeksan 1, dan mengembalikan
True
bukan 1.Cobalah online!
Terima kasih kepada @FelipeNardiBatista karena telah menghemat 8 byte!
sumber
PHP , 72 byte
fungsi rekursif 1-diindeks
Cobalah online!
PHP , 86 byte
Diindeks 0
Cobalah online!
PHP , 89 byte
fungsi rekursif 0-diindeks
Cobalah online!
sumber
Alice , 22 byte
Cobalah online!
Ini menggunakan metode segitiga. Untuk n = 0, ini menghitung B (1) sebagai gantinya, yang nyaman sama dengan B (0).
Penjelasan
Ini adalah templat standar untuk program yang mengambil input dalam mode ordinal, memprosesnya dalam mode kardinal, dan output hasilnya dalam mode ordinal. SEBUAH
1
telah ditambahkan ke template untuk meletakkan nilai itu di tumpukan di bawah input.Program ini menggunakan tumpukan sebagai antrian melingkar yang membesar untuk menghitung setiap baris segitiga. Selama setiap iterasi melewati yang pertama, satu nol implisit di bawah tumpukan menjadi nol eksplisit.
Iterasi pertama secara efektif mengasumsikan kedalaman tumpukan awal nol, meskipun diperlukan 1 di bagian atas tumpukan. Akibatnya, 1 akhirnya ditambahkan ke dirinya sendiri, dan seluruh segitiga dikalikan dengan 2. Membagi hasil akhir dengan 2 memberikan jawaban yang benar.
sumber
Pari / GP , 36 byte
Cobalah online!
sumber