Nomor partisi bilangan bulat positif didefinisikan sebagai jumlah cara yang dapat dinyatakan sebagai jumlah bilangan bulat positif. Dengan kata lain, jumlah partisi integer yang dimilikinya. Misalnya, nomor tersebut 4
memiliki partisi berikut:
[[1, 1, 1, 1], [1, 1, 2], [1, 3], [2, 2], [4]]
Karenanya, ia memiliki 5
partisi. Ini adalah OEIS A000041 .
Tugas
Diberikan bilangan bulat positif N menentukan nomor partisi.
Semua aturan standar berlaku.
Input dan output dapat ditangani melalui cara yang masuk akal.
Ini adalah kode-golf , jadi kode terpendek dalam byte menang.
Uji Kasus
Masukan | Keluaran 1 | 1 2 | 2 3 | 3 4 | 5 5 | 7 6 | 11 7 | 15 8 | 22 9 | 30 10 | 42
code-golf
math
number-theory
combinatorics
integer-partitions
Martin Ender
sumber
sumber
Jawaban:
Pyth , 3 byte
Coba di sini! atau Coba Test suite.
Jawabannya butuh waktu lebih lama untuk memformat daripada menulis kode itu sendiri: P.
Bagaimana?
Pyth adalah alat yang tepat untuk pekerjaan itu.
sumber
Mathematica, 11 byte
Penjelasan
sumber
Python 2 ,
8583 byte-2 byte terima kasih kepada @notjagan
Cobalah online!
Menggunakan rumus rekursif dari OEIS A000041 .
sumber
==0
setara dengan<1
dalam hal ini. EDIT: Gunakan pendekatan<1
bukan==0
, tetapi kode TIO tidak.Emojicode 0,5,
204201 byteCobalah online!
-3 byte dengan menggunakan "kurang dari atau sama dengan 1" alih-alih "kurang dari 2" karena emoji "kurang dari" memiliki pengkodean UTF-8 yang cukup panjang. Juga dibuat
t
beku untuk membungkam peringatan tanpa mempengaruhi jumlah byte.Perpanjang kelas ๐ (integer) dengan metode bernama ๐ ฐ๏ธ. Anda dapat menulis program sederhana yang mengambil angka dari input, memanggil ๐ ฐ๏ธ pada nomor dan mencetak hasilnya seperti ini:
Bagian ini bisa di-golf banyak dengan menghilangkan pesan dan penanganan kesalahan, tetapi itu tidak termasuk dalam skor, jadi saya lebih suka menampilkan lebih banyak fitur Emojicode sebagai gantinya, sambil meningkatkan keterbacaan sepanjang jalan.
Tidak disatukan
Penjelasan
Catatan: banyak pilihan emoji tidak masuk akal di emojicode 0.5. Lagipula 0.x. 0,6 akan memperbaiki ini.
Emojicode adalah bahasa pemrograman berorientasi objek yang menampilkan generik, protokol, opsional, dan penutupan, tetapi program ini tidak menggunakan penutupan dan semua generik dan protokol dapat dianggap implisit, sedangkan satu-satunya opsional muncul di rintisan I / O.
Program ini beroperasi hanya pada beberapa tipe: ๐ adalah tipe integer, ๐ก adalah tipe string dan โฉ adalah tipe range. Beberapa booleans (๐) juga muncul, tetapi mereka hanya digunakan dalam kondisi. Boolean dapat mengambil nilai ๐ atau ๐, yang masing-masing sesuai dengan benar dan salah.
Saat ini tidak ada operator di Emojicode, jadi penambahan, perbandingan dan operasi lain yang biasanya operator diimplementasikan sebagai fungsi, secara efektif membuat ekspresi menggunakan notasi awalan . Operator juga direncanakan dalam 0,6.
Mari kita selesaikan program pengujian terlebih dahulu.
Ini adalah blok ๐, yang dapat dibandingkan dengan main dari bahasa lain.
Anggur dan semangka menyatakan blok kode dalam emojicode.
Ini menyatakan nama "beku"
str
dan menetapkan nilainya ke string baru yang dibuat menggunakan initializer (constructor) ๐ฏ, yang mengambil prompt sebagai string dan kemudian memasukkan baris dari pengguna. Mengapa menggunakan variabel beku daripada variabel? Itu tidak akan berubah, jadi variabel akan memancarkan peringatan.Mari kita jabarkan.
๐str 10
memanggil metode ๐ padastr
beku dengan argumen 10. Dengan konvensi, metode yang dinamai dengan nama tipe mengkonversi objek ke tipe itu. 10 adalah basis yang digunakan untuk konversi integer. Metode ini mengembalikan opsional๐ฌ๐
,. Opsional dapat berisi nilai dari jenis dasar atau ketiadaan, โก. Ketika string tidak berisi angka, โก dikembalikan. Untuk menggunakan nilai, kita harus membuka bungkusan opsional menggunakan ๐บ, yang memunculkan kesalahan runtime jika nilainya โก. Oleh karena itu, praktik yang baik untuk memeriksa ketiadaan sebelum membuka bungkus opsional. Adalah sangat umum, pada kenyataannya, bahwa Emojicode memiliki istilah untuk itu. Biasanya,๐
adalah "jika".๐๐ฆ variable expression
berarti: mengevaluasi ekspresi. Jika opsional berisi ketiadaan, kondisi dievaluasi menjadi ๐ (salah). Jika tidak, nama yang dibekukanvariable
dibuat dengan nilai opsional yang terbuka, dan kondisi dievaluasi menjadi ๐, (benar). Oleh karena itu, dalam penggunaan normal,๐ ... ๐
blok mengikuti persyaratan dimasukkan.๐ ฐ๏ธ adalah metode yang ditambahkan kode utama ๐ menggunakan ๐ yang menghitung jumlah partisi. Ini memanggil ๐ ฐ๏ธ pada
num
beku yang kami nyatakan dalam kondisi dan mengubah hasilnya menjadi string menggunakan basis 10 dengan metode ๐ก. Kemudian, ๐ mencetak hasilnya.๐ berarti "lain", jadi blok ini dimasukkan ketika pengguna tidak memasukkan nomor dengan benar.
Mencetak string literal.
Sekarang, mari kita lihat program utama. Saya akan menjelaskan versi yang tidak diserang; versi golf hanya menghapus spasi dan variabel diubah namanya menjadi nama huruf tunggal.
Perpanjang kelas ๐. Ini adalah fitur yang tidak umum ditemukan dalam bahasa pemrograman. Alih-alih membuat kelas baru dengan ๐ sebagai superclass, ๐ memodifikasi ๐ secara langsung.
Menciptakan metode baru bernama ๐ ฐ๏ธ yang mengembalikan ๐. Ini mengembalikan jumlah partisi yang dihitung menggunakan rumus
a(n) = (1/n) * Sum_{k=0..n-1} sigma(n-k)*a(k)
๐ mirip dengan
this
atauself
dari bahasa lain dan merujuk ke objek metode dipanggil. Implementasi ini bersifat rekursif, jadi ini adalah kondisi terminating: jika jumlah metode yang dipanggil kurang dari atau sama dengan 1, kembalikan 1.Buat variabel baru
sum
dan atur ke 0. Secara implisit mengasumsikan tipe ๐.๐ mengulangi apa pun yang mengimplementasikan protokol ๐๐โช๏ธ, sedangkan โฉ adalah rentang literal yang terjadi untuk mengimplementasikan ๐๐๐. Rentang memiliki nilai awal, nilai berhenti dan nilai langkah, yang dianggap 1 jika
start < stop
, atau -1. Satu juga dapat menentukan nilai langkah dengan menggunakan โญ untuk membuat rentang literal. Nilai awal inklusif, sedangkan nilai stop eksklusif, jadi ini setara denganfor k in range(n)
atauSum_{k=0..n-1}
dalam rumus.Kita perlu menghitung sigma (n - k), atau jumlah pembagi
n - k
dengan kata lain, dan argumen diperlukan beberapa kali, jadi ini menyimpann - k
dalam variabelnmk
untuk menyimpan beberapa byte.Ini mengatur
sig
variabel ke argumen sigma dan mengulangi semua angka dari 1 hingganmk - 1
. Saya bisa menginisialisasi variabel ke 0 dan beralih lebih dari 1..nmk tetapi melakukannya dengan cara ini lebih pendek.๐ฎ menghitung sisanya, atau modulus dan ๐ memeriksa kesetaraan, sehingga kondisinya akan ๐ jika
i
merupakan pembaginmk
.Ini adalah tugas melalui panggilan, mirip dengan
+= -= >>=
keluarga operator dalam beberapa bahasa inferior, bebas emoji. Baris ini juga dapat ditulis sebagai๐ฎ sig โ sig i
. Karena itu, setelah loop dalam selesai,sig
akan berisi jumlah pembagin - k
, atausigma(n - k)
Tugas lain melalui panggilan, jadi ini menambah
sigma(n - k) * A(k)
total, seperti dalam rumus.Akhirnya, jumlah dibagi dengan n dan hasil bagi dikembalikan. Penjelasan ini mungkin memakan waktu sebanyak tiga kali sebanyak menulis kode itu sendiri ...
sumber
Pari / GP , 8 byte
Cobalah online!
sumber
Oktaf, 18 byte
Menggunakan fungsi fungsi bawaan.
Tidak bisa memperbaikinya dengan menggunakan fungsi anonim menggunakan @, bantuan akan dihargai.
sumber
Retina , 34 byte
Cobalah online!
Penjelasan
Konversikan input ke unary.
Ini menghitung semua partisi 2 n-1 dari daftar digit unary. Kami melakukan ini dengan berulang kali (
+
) mencocokkan1
batas non-kata pertama ( ) (\B
yaitu posisi antara dua1
s) di setiap baris (%
) dan menggantinya dengan;
, semuanya setelah itu ($'
), sebuah linefeed (ยถ
), semua yang ada di depan itu ($`
) dan,
. Contoh:Menjadi
Di mana
v
menandai hasil$'
dan^
menandai hasilnya$`
. Ini adalah ungkapan umum untuk mendapatkan hasil dari dua penggantian yang berbeda sekaligus (pada dasarnya kami menyisipkan keduanya;
dan,
penggantian, serta "bagian" string yang hilang untuk menyelesaikan dua pergantian penuh).Kami akan memperlakukan
;
sebagai partisi aktual dan,
hanya sebagai penampung yang mencegah\B
pencocokan berikutnya di sana. Jadi selanjutnya ...... kami menghapus koma itu. Itu memberi kita semua partisi. Misalnya untuk input
4
kita dapatkan:Kami tidak peduli dengan pesanan:
Ini mengurutkan proses
1
s di setiap baris sehingga kami mendapatkan partisi yang tidak terurut.Terakhir, kami menghitung
@
kecocokan unik ( ).+
, yaitu berapa banyak garis / partisi berbeda yang kami peroleh. Saya menambahkan@
opsi ini berabad-abad yang lalu, kemudian benar-benar melupakannya dan baru-baru ini menemukan kembali. Dalam hal ini, ia menyimpan byte lebih dari deduplication pertama barisD`
.sumber
Python 2 ,
5453 byteCobalah online!
Bagaimana itu bekerja
Setiap partisi n dapat direpresentasikan sebagai daftar x = [x 1 , โฏ, x m ] sehingga x 1 + โฏ + x m = n . Representasi ini menjadi unik jika kami mengharuskan x 1 โค โฏ โค x m .
Kami mendefinisikan fungsi bantu f (n, k) yang menghitung partisi dengan batas bawah k , yaitu, daftar x sehingga x 1 + โฏ + x m = n dan k โค x 1 โค โฏ โค x m . Untuk input n , tantangannya meminta output dari f (n, 1) .
Untuk bilangan bulat positif n dan k sedemikian sehingga k โค n , setidaknya ada satu partisi dengan batas bawah k : daftar tunggal [n] . Jika n = k (khususnya, jika n = 1 ), ini adalah satu - satunya partisi yang memenuhi syarat. Di sisi lain, jika k> n , tidak ada solusi sama sekali.
Jika k <n , kita dapat secara rekursif menghitung partisi yang tersisa dengan membangunnya dari kiri ke kanan, sebagai berikut. Untuk setiap j sedemikian sehingga k โค j โค n / 2 , kita dapat membangun partisi [x 1 , โฏ, x m ] = [j, y 1 , โฏ, y m-1 ] . Kami memiliki x 1 + โฏ + x m = n jika dan hanya jika y 1 + โฏ + y m-1 = n - j . Selanjutnya, x 1 โค โฏ โค x m jika dan hanya jika j โค y 1 โค โฏ โค y m-1 .
Oleh karena itu, partisi x dari n yang dimulai dengan j dapat dihitung sebagai f (n - j, j) , yang menghitung partisi y yang valid . Dengan mensyaratkan bahwa j โค n / 2 , kami menjamin bahwa j โค n - j , jadi setidaknya ada satu y . Jadi kita dapat menghitung semua partisi n dengan menjumlahkan 1 (untuk [n] ) dan f (n - j, j) untuk semua nilai valid dari j .
Kode adalah implementasi langsung dari fungsi matematika f . Selain itu, ini menjadikan k default ke 1 , sehingga
f(n)
menghitung nilai f (n, 1) untuk input n .sumber
J ,
3735 byteCobalah online!
Penjelasan
sumber
p(n) = sum(sigma(n-k) * p(k) for k = 0 to n-1) / n
. Saya akan menambahkan penjelasan tentang kode nanti ketika saya yakin kode itu tidak dapat dipersingkat secara signifikan.JavaScript,
125121 byteCobalah online!
Peringatan: kompleksitas waktu dan ruang adalah eksponensial. Bekerja sangat lambat untuk jumlah besar.
sumber
Python 2 , 89 byte
-9 byte oleh Mr.Xcoder -1 byte oleh notjagan
Cobalah online!
sumber
ยฏ\_(ใ)_/ยฏ
- BTW, jika Anda ingin tetap berfungsi penuh, Anda tidak perlu variabel, 94 byteJelly , 13 byte
Cobalah online!
Butuh 5 detik untuk menyelesaikan n = 1000 pada TIO.
sumber
Java 8 (229 byte)
Tidak Terkumpul:
sumber
Jelly , 3 byte
Itu
ลแน
atom baru-baru ini telah ditambahkan, dan itu berarti "Integer partisi".Cobalah online!
sumber
Pyt , 2 byte
Penjelasan:
sumber
JavaScript ES7, 69 Bytes
JavaScript ES6, 71 Bytes
Kompleksitas waktu O (n ^ n), jadi berhati-hatilah (penundaan jelas muncul di komputer saya untuk
F(6)
)sumber