Partisi ketat dari bilangan bulat positif

14

OEIS A000009 menghitung jumlah partisi ketat dari bilangan bulat. SEBUAH partisi yang ketat dari bilangan bulat positif nadalah himpunan bilangan bulat positif (sehingga tidak ada pengulangan diperbolehkan, dan ketertiban tidak peduli) bahwa jumlah untuk n.

Sebagai contoh, 5 memiliki tiga partisi ketat: 5 , 4,1, dan 3,2.

10 memiliki sepuluh partisi:

10
9,1
8,2
7,3
6,4
7,2,1
6,3,1
5,4,1
5,3,2
4,3,2,1

Tantangan

Diberikan bilangan bulat negatif n <1000, hasilkan jumlah partisi ketat yang dimilikinya.

Kasus uji:

0 -> 1

42 -> 1426

Berikut adalah daftar nomor partisi ketat dari 0 hingga 55, dari OEIS:

[1,1,1,2,2,3,4,5,6,8,10,12,15,18,22,27,32,38,46,54,64,76,89,104,122,142,165,192,222,256,296,340,390,448,512,585,668,760,864,982,1113,1260,1426,1610,1816,2048,2304,2590,2910,3264,3658,4097,4582,5120,5718,6378]

Ini adalah , jadi solusi terpendek dalam byte menang.

lirtosiast
sumber

Jawaban:

4

Mathematica, 11 byte

PartitionsQ

Kasus cobaan

PartitionsQ@Range[10]
(* {1,1,2,2,3,4,5,6,8,10} *)
njpipeorgan
sumber
3

Pyth, 7 byte

l{I#./Q

Cobalah online. Suite uji.

  • Ambil input ( Q).
  • Temukan partisinya ( ./).
  • Saring ( #) pada uniquify ( {) tidak berubah (I ) partisi. Ini menghapus partisi dengan duplikat.
  • Temukan panjang hasilnya ( l).
PurkkaKoodari
sumber
3

Haskell, 39 byte

f n=sum[1|x<-mapM(:[0])[1..n],sum x==n]

Fungsi (:[0])mengubah nomor kmenjadi daftar [k,0]. Begitu,

mapM(:[0])[1..n]

menghitung produk Cartesian [1,0],[2,0],...,[n,0], yang memberikan semua himpunan bagian dari [1..n]status 0 untuk elemen yang dihilangkan. Partisi ketat nsesuai dengan daftar tersebut dengan jumlah n. Elemen-elemen tersebut dihitung dengan pemahaman daftar, yang lebih pendek dari length.filter.

Tidak
sumber
Cemerlang! Saya mencari pengganti subsequences(+ import) pada jawaban saya sendiri, tetapi sejauh ini tidak berhasil.
nimi
2

ES6, 64 byte

f=(n,k=0)=>[...Array(n)].reduce((t,_,i)=>n-i>i&i>k?t+f(n-i,i):t,1)

Bekerja dengan pengurangan percobaan rekursif. kadalah angka yang terakhir dikurangkan, dan angka berikutnya yang harus dikurangkan harus lebih besar (tetapi tidak terlalu besar sehingga jumlah yang lebih besar tidak dapat dikurangkan). 1 ditambahkan karena Anda selalu dapat mengurangi nsendiri. (Juga karena ini bersifat rekursif saya harus berhati-hati karena semua variabel saya adalah lokal.)

Neil
sumber
2

Python, 68 byte

p=lambda n,d=0:sum(p(n-k,n-2*k+1)for k in range(1,n-d+1))if n else 1

Panggil saja fungsi anonim melewati bilangan bulat negatif nsebagai argumen ... dan tunggu akhir jagat raya.

Bob
sumber
buat itu n>0, Anda menghemat satu byte dan pergi lebih cepat (saya yakin Anda berulang pada angka negatif): P
st0le
Juga, Memo kecepatan semacam ini naik
st0le
Anda tidak dapat mengubah pernyataan if ke:return sum(...)if n else 1
andlrc
@randomra Tentu saja, tentu saja ...
Bob
1

Python 2, 49 byte

f=lambda n,k=1:n/k and f(n-k,k+1)+f(n,k+1)or n==0

Cabang-cabang rekursi pada setiap peubah potensial kdari 1ke nuntuk memutuskan apakah itu harus dimasukkan. Setiap sumum yang dimasukkan dikurangi dari jumlah yang diinginkan n, dan pada akhirnya, jika n=0tetap, jalur itu dihitung.

Tidak
sumber
1

Haskell, 43 byte

0%0=1
_%0=0
n%k=n%(k-1)+(n-k)%(k-1)
f n=n%n

Fungsi biner n%kmenghitung jumlah partisi ketat nmenjadi beberapa bagian dengan bagian maksimum k, sehingga fungsi yang diinginkan adalah f n=n%n. Setiap nilai kdapat dimasukkan, yang menurun ndengan k, atau dikecualikan, dan bagaimanapun maksimum baru ksatu lebih rendah, memberikan rekursi n%k=n%(k-1)+(n-k)%(k-1).

Tidak
sumber
n%k|q<-k-1=n%q+(n-k)%qmencukur byte dari jalur 3.
Izaak Weiss
0

Julia, 53 byte

n->endof(collect(filter(p->p==∪(p),partitions(n))))

Ini adalah fungsi anonim yang menerima integer dan mengembalikan integer. Untuk menyebutnya, tetapkan ke variabel.

Kami mendapatkan partisi integer menggunakan partitions, filterhanya mereka yang memiliki puncak yang berbeda, collectke dalam array, dan menemukan indeks terakhir (yaitu panjang) menggunakan endof.

Alex A.
sumber
0

Haskell, 58 byte

import Data.List
h x=sum[1|i<-subsequences[1..x],sum i==x]

Contoh penggunaan: map h [0..10]-> [1,1,1,2,2,3,4,5,6,8,10].

Ini adalah pendekatan brute force sederhana. Periksa jumlah semua bagian dari 1..x. Ini juga bekerja untuk x == 0, karena semua urutan dari [1..0]adalah [[]]dan jumlah dari []adalah 0.

nimi
sumber
0

05AB1E , 8 byte

ÅœʒDÙQ}g

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

Ŝ          # Get all integer partitions of the (implicit) input
            #  i.e. 5 → [[1,1,1,1,1],[1,1,1,2],[1,1,3],[1,2,2],[1,4],[2,3],[5]]
  ʒ   }     # Filter by:
   D        #  Duplicate the current partition
    Ù       #  Uniquify (removing any duplicated values from) this copied partition
            #   i.e. [1,1,1,1,1] → [1]
            #   i.e. [1,4] → [1,4]
     Q      #  Check if it's still the same
            #   i.e. [1,1,1,1,1] and [1] → 0 (falsey)
            #   i.e. [1,4] and [1,4] → 1 (truthy)
       g    # Then take the length of the filtered list (and implicitly output it)
            #  i.e. [[1,4],[2,5],[5]] → 3
Kevin Cruijssen
sumber
0

05AB1E , 5 byte

LæOQO

Cobalah online!

Catatan: ini sangat lambat dan akan kehabisan input lebih dari sekitar 20.

Penjelasan:

L         # range 1..input
 æ        # list of subsets
  O       # sum each subset
   Q      # equal? (1 for each sum that equals the input, 0 otherwise)
    O     # sum the booleans
Grimmy
sumber