P k (n) berarti jumlah partisi n
menjadi k
bagian-bagian yang tepat . Diberikan n
dan k
, hitung P k (n).
Kiat: P k (n) = P k (n − k) + P k − 1 (n − 1), dengan nilai awal p 0 (0) = 1 dan p k (n) = 0 jika n ≤ 0 atau k ≤ 0. [Wiki]
Contohnya
n k Ans
1 1 1
2 2 1
4 2 2
6 2 3
10 3 8
Aturan
- Aturan golf-kode umum berlaku.
code-golf
combinatorics
integer-partitions
Matthew Roh
sumber
sumber
8
bukan7
.Jawaban:
Pyth ,
976 byte-1 byte terima kasih kepada Erik the Outgolfer !
Cobalah online!
Input ke program dibalik (yaitu
k, n
).sumber
Swift ,
7673 byteCobalah online!
Penjelasan
Bagaimana cara kerja kode secara struktural?
Pertama-tama, kita mendefinisikan fungsi kita
P
, dengan dua parameter bilangan bulatn
dank
, dan memberikan jenis kembalinyaInt
, dengan potongan kode ini:func P(_ n:Int,_ k:Int)->Int{...}
. Trik keren di sini adalah bahwa kita memberi tahu kompiler untuk mengabaikan nama-nama parameter, dengan_
diikuti oleh spasi, yang menyelamatkan kita dua byte ketika kita memanggil fungsi.return
jelas digunakan untuk mengembalikan hasil terner bersarang kami yang dijelaskan di bawah ini.Trik lain yang saya gunakan adalah
n*k>0
, yang menyelamatkan kita beberapa byten>0&&k>0
. Jika kondisinya benar (kedua bilangan bulat masih lebih tinggi dari0
), maka kami secara rekursif memanggil fungsi kami dengann
dikurangi olehk
sebagai yang barun
dank
tetap sama, dan kami menambahkan hasilP()
dengann
dank
dikurangi dengan 1. Jika kondisi tersebut tidak benar , kami mengembalikan salah satu1
atau0
bergantung pada apakahn
sama dengank
.Bagaimana cara kerja algoritma rekursif?
Kita tahu bahwa elemen pertama dari urutan adalah p 0 (0) , dan kami memeriksa bahwa kedua bilangan bulat positif (
n*k>0
). Jika mereka tidak lebih tinggi dari 0, kami memeriksa apakah mereka sama (n==l ?1:0
), di sini menjadi dua kasus:Tepat ada 1 partisi yang mungkin, dan dengan demikian kita mengembalikan 1, jika bilangan bulat sama.
Tidak ada partisi jika salah satunya sudah 0 dan yang lainnya belum.
Namun, jika keduanya positif, kami memanggil
P
dua kali secara rekursif , menambahkan hasilP(n-k,k)
danP(n-1,k-1)
. Dan kita mengulang lagi sampain
mencapai 0.* Catatan: Spasi tidak dapat dihapus.
sumber
Jelly , 6 byte
Cobalah online!
sumber
Python 2 ,
61555150 byte-10 byte terima kasih kepada Erik the Outgolfer. -1 byte terima kasih kepada Tn. Xcoder.
Saya akan mengatakan, saya menyalin petunjuk dari OP dan menerjemahkannya ke Python. : P
Cobalah online!
sumber
(n>0and k>0)
->n>0<k
+(n==k)
bukan[0,1][n==k]
.or +
.n>0<k and
dengann*k>0and
Mathematica, 33 byte
di sini adalah tabel nxk
sumber
Length
->Len`1
danIntegerPartitions
->Int`7
JavaScript (ES6),
424039 byteSaya pikir ini berhasil.
Cobalah
sumber
MATL , 14 byte
Cobalah online!
Penjelasan
Pertimbangkan input
6
,2
.sumber
Haskell, 41 byte
Cobalah online!
sumber
Haskell , 41 byte
Cobalah online!
Perulangan alternatif.
sumber
Pari / GP , 35 byte
Pari / GP memiliki built-in untuk iterasi partisi integer.
Cobalah online!
sumber
Jelly , 13 byte
Saya
merasatahu pendekatan dasar ini tidak akan menjadi golfiest!Cobalah online!
sumber
05AB1E , 9 byte
Cobalah online!
sumber
CJam , 18 byte
Cobalah online!
Mengharapkan input terbalik, yaitu
k n
bukannyan k
.sumber
Scala , 73 byte
Nah ini adalah beberapa penggunaan tip OP yang bebas unorkorked.
k
dann
merupakan parameter fungsi rekursif sayaf
. Lihat tautan TIO untuk konteks.Karena ini bersifat rekursif, haruskah saya menyertakan fungsi def dalam jumlah byte?
Cobalah online!
sumber
C (gcc) , 41 byte
Cobalah online!
sumber
R (+ pryr), 49 byte
Yang mengevaluasi fungsi rekursif
(k < 1 | n < 1)
memeriksa apakah ada kondisi awal terpenuhi.!n + k
mengevaluasi ke TRUE (1) jika keduanyan
dank
0, dan FALSE (0) sebaliknya.f(n - k, k) + f(n - 1, k - 1)
menangani rekursi.sumber