Berapa banyak partisi yang saya miliki?


16

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 4memiliki partisi berikut:

[[1, 1, 1, 1], [1, 1, 2], [1, 3], [2, 2], [4]]

Karenanya, ia memiliki 5partisi. 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 , 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

1
Saya hampir yakin ini adalah duplikat ...
DJMcMayhem

@DJMcMayhem Umm, ok. Beri tahu saya jika Anda menemukan duplikat. Maaf, saya baru mengenal semua ini!

1
@DJMcMayhem mungkin pertanyaan ini Anda tanyakan karena ini adalah langkah singkat dari "menghasilkan" menjadi "menghitung" tetapi Anda tidak harus membuat semua partisi untuk menghitungnya ...
Giuseppe

1
ini adalah sebuah penipuan, KECUALI yang merupakan popcon (?) dan ditutup sebagai terlalu luas. IMHO ini CARA ditulis lebih baik dan harus tetap terbuka, sedangkan yang lama harus (dibuka kembali) ditutup sebagai dupe
Rod

2
@Rod, ini adalah pop-con yang buruk, tetapi mengganti alasan tutup untuk menipu tidak akan menjadi perbaikan. Persyaratan kinerja akan ada penghalang untuk porting beberapa jawaban (tidak ada yang akan menghasilkan 24061467864032622473692149727991 partisi 1000 dalam beberapa menit); dan implementasi Hardy-Ramanujan-Rademacher tidak persis golf ... Namun, mungkin ada baiknya membuka diskusi dalam meta tentang apa yang harus dilakukan dengan pertanyaan ini dan yang itu.
Peter Taylor

Jawaban:


13

Pyth , 3 byte

l./

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.

l / Program penuh dengan input implisit.

 ./ Partisi integer. Kembalikan semua daftar bilangan bulat positif yang diurutkan yang menambah input.
l Panjang.
      Secara implisit mengeluarkan hasilnya.

34

Mathematica, 11 byte

PartitionsP

Penjelasan

ยฏ\_(ใƒ„)_/ยฏ


8

Emojicode 0,5, 204 201 byte

๐Ÿ‹๐Ÿš‚๐Ÿ‡๐Ÿ–๐Ÿ…ฐ๏ธโžก๐Ÿš‚๐Ÿ‡๐ŸŠโฌ…๐Ÿ•1๐Ÿ‡๐ŸŽ1๐Ÿ‰๐Ÿฎs 0๐Ÿ”‚kโฉ0๐Ÿ•๐Ÿ‡๐Ÿฆtโž–๐Ÿ•k๐Ÿฎr t๐Ÿ”‚iโฉ1 t๐Ÿ‡๐ŸŠ๐Ÿ˜›๐Ÿšฎt i 0๐Ÿ‡๐Ÿฎโž•r i๐Ÿ‰๐Ÿ‰๐Ÿฎโž•sโœ–r๐Ÿ…ฐ๏ธk๐Ÿ‰๐ŸŽโž—s๐Ÿ•๐Ÿ‰๐Ÿ‰

Cobalah 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 tbeku 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:

๐Ÿ๐Ÿ‡
 ๐Ÿฆstr๐Ÿ”ท๐Ÿ”ก๐Ÿ˜ฏ๐Ÿ”คPlease enter a number๐Ÿ”ค
 ๐ŸŠ๐Ÿฆnum๐Ÿš‚str 10๐Ÿ‡
  ๐Ÿ˜€๐Ÿ”ก๐Ÿ…ฐ๏ธnum 10
 ๐Ÿ‰๐Ÿ“๐Ÿ‡
  ๐Ÿ˜€๐Ÿ”คLearn what a number is, you moron!๐Ÿ”ค
 ๐Ÿ‰
๐Ÿ‰

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

๐Ÿ‹๐Ÿš‚๐Ÿ‡
 ๐Ÿ–๐Ÿ…ฐ๏ธโžก๐Ÿš‚๐Ÿ‡
  ๐ŸŠโ—€๏ธ๐Ÿ•2๐Ÿ‡
   ๐ŸŽ1
  ๐Ÿ‰
  ๐Ÿฎsum 0
  ๐Ÿ”‚kโฉ0๐Ÿ•๐Ÿ‡
   ๐Ÿฆnmkโž–๐Ÿ•k
   ๐Ÿฎsig nmk
   ๐Ÿ”‚iโฉ1 nmk๐Ÿ‡
    ๐ŸŠ๐Ÿ˜›๐Ÿšฎnmk i 0๐Ÿ‡
     ๐Ÿฎโž•sig i
    ๐Ÿ‰
   ๐Ÿ‰
   ๐Ÿฎโž•sumโœ–sig๐Ÿ…ฐ๏ธk
  ๐Ÿ‰
  ๐ŸŽโž—sum๐Ÿ•
 ๐Ÿ‰
๐Ÿ‰

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.

๐Ÿฆstr๐Ÿ”ท๐Ÿ”ก๐Ÿ˜ฏ๐Ÿ”คPlease enter a number๐Ÿ”ค

Ini menyatakan nama "beku" strdan 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.

๐ŸŠ๐Ÿฆnum๐Ÿš‚str 10

Mari kita jabarkan. ๐Ÿš‚str 10memanggil metode ๐Ÿš‚ pada strbeku 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 expressionberarti: mengevaluasi ekspresi. Jika opsional berisi ketiadaan, kondisi dievaluasi menjadi ๐Ÿ‘Ž (salah). Jika tidak, nama yang dibekukan variabledibuat dengan nilai opsional yang terbuka, dan kondisi dievaluasi menjadi ๐Ÿ‘, (benar). Oleh karena itu, dalam penggunaan normal, ๐Ÿ‡ ... ๐Ÿ‰blok mengikuti persyaratan dimasukkan.

๐Ÿ˜€๐Ÿ”ก๐Ÿ…ฐ๏ธnum 10

๐Ÿ…ฐ๏ธ adalah metode yang ditambahkan kode utama ๐Ÿš‚ menggunakan ๐Ÿ‹ yang menghitung jumlah partisi. Ini memanggil ๐Ÿ…ฐ๏ธ pada numbeku 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.

๐Ÿ˜€๐Ÿ”คLearn what a number is, you moron!๐Ÿ”ค

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 rumusa(n) = (1/n) * Sum_{k=0..n-1} sigma(n-k)*a(k)

๐ŸŠโฌ…๐Ÿ•1๐Ÿ‡
 ๐ŸŽ1
๐Ÿ‰

๐Ÿ• mirip dengan thisatau selfdari 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.

๐Ÿฎsum 0

Buat variabel baru sumdan atur ke 0. Secara implisit mengasumsikan tipe ๐Ÿš‚.

๐Ÿ”‚kโฉ0๐Ÿ•

๐Ÿ”‚ 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 dengan for k in range(n)atau Sum_{k=0..n-1}dalam rumus.

๐Ÿฆnmkโž–๐Ÿ•k

Kita perlu menghitung sigma (n - k), atau jumlah pembagi n - kdengan kata lain, dan argumen diperlukan beberapa kali, jadi ini menyimpan n - kdalam variabel nmkuntuk menyimpan beberapa byte.

๐Ÿฎsig nmk
๐Ÿ”‚iโฉ1 nmk

Ini mengatur sigvariabel ke argumen sigma dan mengulangi semua angka dari 1 hingga nmk - 1. Saya bisa menginisialisasi variabel ke 0 dan beralih lebih dari 1..nmk tetapi melakukannya dengan cara ini lebih pendek.

๐ŸŠ๐Ÿ˜›๐Ÿšฎnmk i 0

๐Ÿšฎ menghitung sisanya, atau modulus dan ๐Ÿ˜› memeriksa kesetaraan, sehingga kondisinya akan ๐Ÿ‘ jika imerupakan pembagi nmk.

๐Ÿฎโž•sig i

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, sigakan berisi jumlah pembagi n - k, atausigma(n - k)

๐Ÿฎโž•sumโœ–sig๐Ÿ…ฐ๏ธk

Tugas lain melalui panggilan, jadi ini menambah sigma(n - k) * A(k)total, seperti dalam rumus.

๐ŸŽโž—sum๐Ÿ•

Akhirnya, jumlah dibagi dengan n dan hasil bagi dikembalikan. Penjelasan ini mungkin memakan waktu sebanyak tiga kali sebanyak menulis kode itu sendiri ...



3

Oktaf, 18 byte

partcnt(input(''))

Menggunakan fungsi fungsi bawaan.

Tidak bisa memperbaikinya dengan menggunakan fungsi anonim menggunakan @, bantuan akan dihargai.


3

Retina , 34 byte

.+
$*
+%1`\B
;$'ยถ$`,
,

%O`1+
@`.+

Cobalah online!

Penjelasan

.+
$*

Konversikan input ke unary.

+%1`\B
;$'ยถ$`,

Ini menghitung semua partisi 2 n-1 dari daftar digit unary. Kami melakukan ini dengan berulang kali ( +) mencocokkan 1batas non-kata pertama ( ) ( \Byaitu posisi antara dua 1s) di setiap baris ( %) dan menggantinya dengan ;, semuanya setelah itu ( $'), sebuah linefeed ( ยถ), semua yang ada di depan itu ( $`) dan ,. Contoh:

1;1,111

Menjadi

      vv
1;1,1;11
1;1,1,11
^^^^^

Di mana vmenandai 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 \Bpencocokan berikutnya di sana. Jadi selanjutnya ...

,

... kami menghapus koma itu. Itu memberi kita semua partisi. Misalnya untuk input 4kita dapatkan:

1;1;1;1
1;1;11
1;11;1
1;111
11;1;1
11;11
111;1
1111

Kami tidak peduli dengan pesanan:

%O`1+

Ini mengurutkan proses 1s 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 baris D`.


3

Python 2 , 54 53 byte

f=lambda n,k=1:1+sum(f(n-j,j)for j in range(k,n/2+1))

Cobalah 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 .


Oh wow, ini luar biasa! Bisakah Anda menambahkan penjelasan tentang cara kerjanya?

Saya sudah mengedit jawaban saya. Jika ada sesuatu yang tidak jelas, silahkan beritahu saya.
Dennis

3

J , 37 35 byte

0{]1&((#.]*>:@#.~/.~&.q:@#\%#),])1:

Cobalah online!

Penjelasan

0{]1&((#.]*>:@#.~/.~&.q:@#\%#),])1:  Input: n
                                 1:  Constant 1
  ]                                  Get n
   1&(                          )    Repeat n times on x = [1]
                          \            For each prefix
                         #               Length
                      q:@                Prime factors
                 /.~&                    Group equal factors
              #.~                        Compute p+p^2+...+p^k for each group
           >:@                           Increment
                    &.q:                 Product
                           %           Divide
                            #          Length
         ]                             Get x
          *                            Times
   1   #.                              Sum
                              ,        Joim
                               ]       Get x
                                       Set this as next value of x
0{                                   Select value at index 0

Saya tercengang dan tercengang, keberatan memposting penjelasan?
cole

1
@cole Ini adalah pendekatan berulang yang dimulai dengan solusi untuk p (0) = 1, dan membangun selanjutnya menggunakan rumus 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.
mil

2

JavaScript, 125 121 byte

n=>(z=(a,b)=>[...Array(a)].map(b))(++n**n,(_,a)=>z[F=z(n,_=>a%(a/=n,n)|0).sort().join`+`]=b+=eval(F)==n-1&!z[F],b=0)|b||1

Cobalah online!

Peringatan: kompleksitas waktu dan ruang adalah eksponensial. Bekerja sangat lambat untuk jumlah besar.


2

Python 2 , 89 byte

-9 byte oleh Mr.Xcoder -1 byte oleh notjagan

lambda n:len(p(n))
p=lambda n,I=1:{(n,)}|{y+(x,)for x in range(I,n/2+1)for y in p(n-x,x)}

Cobalah online!



@ Mr.Xcoder Bahkan tidak tahu, mengapa saya tidak menggunakan lambda D:
Dead Possum

Hehe, ยฏ\_(ใƒ„)_/ยฏ- BTW, jika Anda ingin tetap berfungsi penuh, Anda tidak perlu variabel, 94 byte
Mr. Xcoder

@ Mr.Xcoder Ya .. Saya merasa berkarat setelah beberapa waktu jauh dari codegolf: c
Dead Possum



0

Java 8 (229 byte)

import java.util.function.*;class A{static int j=0;static BiConsumer<Integer,Integer>f=(n,m)->{if(n==0)j++;else for(int i=Math.min(m,n);i>=1;i--)A.f.accept(n-i,i);};static Function<Integer,Integer>g=n->{f.accept(n,n);return j;};}

Tidak Terkumpul:

import java.util.function.*;

class A {
    static int j = 0;
    static BiConsumer<Integer, Integer> f = (n, m) -> {
        if (n == 0)
            j++;
        else
            for (int i = Math.min(m, n); i >= 1; i--)
                A.f.accept(n - i, i);
    };
    static Function<Integer, Integer> g = n -> {
        f.accept(n, n);
        return j;
    };
}

0

Jelly , 3 byte

Itu ล’แน— atom baru-baru ini telah ditambahkan, dan itu berarti "Integer partisi".

ล’แน—L

Cobalah online!

ล’แน—L - Program lengkap.

ล’แน— - Partisi integer.
  L - Panjang.
      - Output tersirat.


0

JavaScript ES7, 69 Bytes

n=>(f=(i,s)=>i?[for(c of Array(1+n))f(i-1,s,s-=i)]:c+=!s)(n,n,c=0)&&c

JavaScript ES6, 71 Bytes

n=>(f=(i,s)=>i?[...Array(1+n)].map(_=>f(i-1,s,s-=i)):c+=!s)(n,n,c=0)&&c

Kompleksitas waktu O (n ^ n), jadi berhati-hatilah (penundaan jelas muncul di komputer saya untuk F(6))

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.