Tantangan
Dalam tugas ini Anda telah menghitung jumlah cara kami dapat mendistribusikan bola A ke dalam sel B dengan setiap sel memiliki setidaknya satu bola.
Input A dan B diberikan dalam satu baris yang dipisahkan oleh blank, input diakhiri oleh EOF.
Anda mungkin ingin memeriksa solusi Anda di sini .
Memasukkan
0 0
1 0
12 4
6 3
18 17
20 19
15 13
18 9
20 20
17 14
9 2
14 13
18 11
Keluaran
1
0
14676024
540
54420176498688000
23112569077678080000
28332944640000
38528927611574400
2432902008176640000
21785854970880000
510
566658892800
334942064711654400
Kendala
- Setiap A dan B dapat dibedakan.
- 0 <= A, B <= 20
- Anda dapat menggunakan bahasa pilihan Anda
- Solusi terpendek menang!
code-golf
math
combinatorics
Pemurah
sumber
sumber
S(n,0)
adalah1
jikan=0
dan0
sebaliknya). Jika mau, saya dapat menemukan referensi untuk pernyataan yang lebih kuat bahwa Stirling2 ada dalam subkelompok asosiatif dari grup Riordan eksponensial.Jawaban:
JavaScript (90
93)http://jsfiddle.net/RDGUn/2/
Jelas, bahasa berbasis matematika seperti APL akan mengalahkan saya karena sintaks verbositas dan kurangnya konstruk matematika bawaan :)
Sunting Juga, saya tidak memiliki fungsionalitas yang berhubungan dengan input kecuali parameter dilewatkan ke fungsi, tidak yakin bagaimana menggunakan input standar dengan JavaScript ...
Sunting: Bergerak
i--
kem=m*
ekspresi; pindahn*=-1
kefor
; mulair=1
untuk menggabungkan tugas dan menghapus yang asing sebagai balasannya. (simpan 3 karakter)sumber
readline
danprint
. Saya tidak tahu apa yang digunakan orang lain di sini.prompt
danalert
adalah "standar" dari JavaScript, karena itu adalah panggilan pemblokiran khas untuk panggilan io, meskipun pada kenyataannya Anda tidak akan pernah menggunakan pemblokiran secara default dengan JavaScript.Golfscript -
56 50 49 48 41 40 3837 karakterCatatan: ini menangani banyak jalur input, cepat (1/8 detik untuk mengerjakan kasus uji), dan tidak merusak input hukum apa pun.
(Versi pertama juga merupakan program Golfscript pertama saya; terima kasih kepada eBusiness karena menunjukkan beberapa trik yang saya lewatkan).
Untuk menjadikan ini sebagai pos pendidikan yang bermanfaat juga, berikut ini penjelasan cara kerjanya. Kita mulai dengan pengulangan
f(n, k) = k * (f(n-1, k) + f(n-1, k-1))
. Hal ini dapat dipahami secara kombinatoris dengan mengatakan bahwa untuk menempatkann
bola yang dapat dibedakan dalamk
ember yang dapat dibedakan sedemikian rupa sehingga setiap ember berisi setidaknya satu bola, Anda memilih salah satuk
ember untuk bola pertama (k *
) dan kemudian ia akan mengandung setidaknya satu bola lagi (f(n-1, k)
) atau itu tidak akan (f(n-1, k-1)
).Nilai yang dihasilkan dari formulir ini berupa kisi; mengambil
n
sebagai indeks baris dank
sebagai indeks kolom dan pengindeksan dari 0 dimulaiJadi beralih ke program,
Membagi input menjadi garis dan kemudian untuk setiap baris mengevaluasinya, meletakkan
n
dank
di stack, dan kemudian memanggil<<STUFF>>
, yaitu sebagai berikut:Ini menghitung
k+1
entri pertama darin+1
baris ke-k dari kisi itu. Awalnya tumpukan itun k
.),
memberi tumpukann [0 1 2 ... k]
{!}%
memberi tumpukan din [1 0 0 ... 0]
mana adak
0s.\{ <<MORE STUFF>> }*
membawan
ke atas dan membuatnya menjadi berapa kali kita mengeksekusi<<MORE STUFF>>
.Tumpukan kami saat ini adalah deretan tabel:
[f(i,0) f(i,1) ... f(i,k)]
0.@
menempatkan beberapa 0 sebelum array itu. Yang pertama akan menjadij
dan yang kedua akanf(i,j-1)
.{ <<FINAL LOOP>> }/
loop melalui elemen array; untuk masing-masing menempatkannya di atas tumpukan dan kemudian menjalankan loop body..@+2$*@)@
adalah manipulasi stack membosankan untuk mengambil... j f(i,j-1) f(i,j)
dan menghasilkan... j*(f(i,j-1)+f(i,j)) j+1 f(i,j)
;;]
muncul dari sisak+1 f(i,k)
dan mengumpulkan semuanya menjadi sebuah array, siap untuk putaran berikutnya loop.Akhirnya, ketika kita telah membuat
n
baris ke-5 dari tabel,)p;
ambil elemen terakhir, cetak, dan buang sisa baris.Untuk anak cucu, tiga solusi 38-char pada prinsip ini:
n%{~),{!}%\{0.@{.@+@.@*\)@}/;;]}*)p;}/
n%{~),{!}%\{0:x\{x\:x+1$*\)}/;]}*)p;}/
n%{~),{!}%\{0.@{@1$+2$*\@)}/;;]}*)p;}/
sumber
[0]
->1,
, ruang setelah zip hanya dapat dihapus, dan ruang lainnya dapat dihapus jika Anda hanya menyimpan di operator bukan k. Saya belum melangkah melalui kode Anda, tetapi saya curiga Anda mungkin lolos dengan hanya menggunakan nilai tanpa meletakkannya dalam array di beberapa tempat.J, 40
Misalnya
<1detik untuk semua kasus uji.
Suntingan
-/
alih - alih bergantian(1 _1)*
(ide JB)1x+
sumber
1x+
, tapi itu hanya membeli saya kembali 1 karakter, sedangkan Anda mengambil 5!Gangguan Umum (83)
Sepertinya harus ada cara yang lebih pendek untuk menguji kasus dasar, tetapi tidak ada yang terjadi pada saya begitu saja.
sumber
J, 38 hingga 42
Bergantung pada preferensi ketat Anda tentang bahasa interaktif dan presentasi keluaran, pilihlah dari spektrum solusi:
4 :'|-/(!&y*^&x)i.1x+y'/&".;._2(1!:1)3
Luncurkan jconsole, masukkan, lalu tempel input (akhiri dengan Cd). Anda akan melihat output dipisahkan oleh ruang (J adalah bahasa vektor, ia melakukan perhitungan pada seluruh input secara keseluruhan dan mengembalikannya sebagai vektor 1D, yang presentasi defaultnya adalah pada satu baris). Saya anggap oke, semangat masalah ini adalah perhitungan, bukan presentasi. Tetapi jika Anda bersikeras memiliki baris baru sebagai gantinya:
4 :'|-/(!&y*^&x)i.1x+y'/&.".;._2(1!:1)3
Mengganti Tulisan (
&
) dengan Bawah (&.
) mengembalikan vektor string, yang presentasinya berakhir pada baris terpisah.4 :'echo|-/(!&y*^&x)i.1x+y'/&".;._2(1!:1)3
Jalankan dari baris perintah sebagai
$ jconsole balls.ijs < balls.in
Jika Anda memilih ini, Anda mungkin ingin memberikan solusi Eelvex juga.
sumber
&.
untuk bekerja dengan baik pada mode interaktif.4 :'|-/(!&y*^&x)i.1x+y'/&.".;._2(1!:1)3
. 39 karakter.GolfScript -
453836 karakterRelasi rekurensi implementasi kotor-kekuatan sedang (
3836 karakter):Relasi perulangan yang saya curi dari solusi Peter Taylors, seperti ini:
f(x, y) = y * ( f(x-1, y) + f(x-1, y-1) )
Dengan kasus khusus jika salah satu variabel adalah 0.
Implementasi saya tidak menggunakan kembali hasil sebelumnya, sehingga setiap fungsi memanggil cabang ke dua panggilan baru, kecuali salah satu dari nol kasus telah tercapai. Ini memberikan kasus terburuk 2 ^ 21-1 panggilan fungsi yang memakan waktu 30 detik pada mesin saya.
Solusi seri gaya ringan (45 karakter):
sumber
J, 55 karakter
wd
). Input pada stdin, output pada stdout.Skrip uji bash:
sumber
wd
?echo
, yang didefinisikan sebagai0 0&$@(1!:2&2)
. Saya tidak yakin apa artinya itu, tetapi ia melakukan sesuatu seperti item peringkat-cukup-cetak dengan jeda baris. (Saya baru saja memperhatikan bahwa menggunakan 2 daripada 4 ... Saya pikir itu masih pergi ke stdout dalam mode konsol, setidaknya.)<< was unexpected at this time.
Maaf saya baru untuk input J, saya selalu menggunakannya dalam mode konsol.Golfscript - 26 karakter
Peringatan: Kasing 12 4 membutuhkan banyak memori (walaupun tidak sebanyak jawaban di bawah) dan membutuhkan waktu yang cukup lama untuk dijalankan
Jelas jawaban ini memiliki beberapa masalah, tetapi saya akan meninggalkannya di sini karena komentar merujuk padanya dan jawaban mellamokb didasarkan padanya.
Golfscript - 24 karakter
Peringatan: Kasing 12 4 membutuhkan banyak memori dan perlu waktu cukup lama untuk dijalankan
sumber
0 0
harus menghasilkan1
;0 k
untuk yang laink
harus menghasilkan0
;n 1
untukn > 0
harus menghasilkan1
.Python 140 Chars
sumber
dc, 100 karakter
Sayangnya, dc sepertinya tidak didukung oleh ideone. Mungkin ada satu atau dua karakter yang masih harus dimatikan, tetapi ini adalah waktu tidur.
Catatan: ini mendukung beberapa jalur input, memiliki presisi yang cukup untuk memberikan output yang benar bahkan untuk
20 19
(mengutuk Anda, Perl, untuk waktu saya membuang debugging solusi saya!), Dan memberikan output yang benar untuk0 0
.Saran dari Nabb memungkinkan pemendekan setidaknya sejauh
dengan biaya meninggalkan sampah di tumpukan register (dan dengan demikian kehabisan memori jika kita menghitung miliaran jawaban).
sumber
l11
diuraikan sebagail1 1
(Anda dapat menggunakanK
sebagai token karakter tunggal untuk0
jika Anda tidak akan mengubah ketelitian bagaimanapun). Anda dapat mengubah loop input menjadi?[...?z1=4]
. Anda dapat memasukkan makro dalam register1
. Dan Anda mungkin dapat menyimpan tumpukan lebih banyak karakter secara umum, tetapi saya akan menunggu lebih pendek untuk memahaminya.Golfscript (28
3137)~):$\.($\?:@;?,{@+}%{$base$,\-[0]=},,
Modifikasi ke
gnibbler
solusi GolfScript. Saya pikir ini adalah solusi yang berfungsi - diuji dengan [3,2], [4,2], [6,3], dan [9,2] dengan jawaban yang benar. (Saya menggunakan$
dan@
untuk variabel untuk memperketat ruang di sekitarbase
kata kunci).Ada dua masalah dengan
gnibbler
solusi saat ini.Edit
~:@\?:$,{$+}%{@base(;@,\-,0=},,
Solusi yang lebih baik! Tidak perlu naik, tambahkan saja semua angka sehingga mereka mulai dengan [1], dan tidak ada digit yang akan hilang (termasuk padding kiri 0's) setelah Anda menentukan digit pertama itu. Solusi ini harus berfungsi dan telah diuji dengan entri yang sama di atas. Ini juga jauh lebih cepat karena kita tidak menambah sebelum mengambil eksponen untuk menghasilkan array (tetapi masih menderita masalah kinerja / memori yang sama untuk input yang lebih besar).
Sunting : Gunakan
gnibbler
gagasan untuk memindahkan penambahan bagian$
dalam filter alih-alih sebagai langkah tambahan. (simpan 3 karakter).sumber
0 0
.n 1
untuk n apa pun, menyebabkannya menggantung. hmm ..05AB1E , 19 byte
CATATAN: Ini sangat lambat, dan sudah waktunya habis
12 4
. Ini berfungsi sebagaimana dimaksud, meskipun.Akan melihat apakah saya dapat menemukan metode alternatif yang berfungsi untuk semua kasus uji dalam waktu yang wajar.Lihat di bawah untuk versi yang jauh lebih cepat yang menjalankan semua kasus uji dalam waktu kurang dari satu detik.Cobalah secara online atau verifikasi beberapa kasus uji (yang lebih kecil) .
Penjelasan:
05AB1E , 29 byte
Berikut versi yang jauh lebih cepat yang berfungsi untuk semua kasus uji dalam waktu sekitar 0,5 detik pada TIO:
Port dari jawaban JavaScript @mellamokb , jadi pastikan untuk menghapusnya!
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
CATATAN: Berfungsi untuk kasus tepi
0 0
dalam kasus ini (tidak seperti jawaban JavaScript yang saya gunakan untuk porting metode ini), karenaL
builtin akan membuat daftar[0,1]
.sumber