正の整数の厳密なパーティション


14

OEIS A000009は、整数の厳密なパーティションの数をカウントします。厳格なパーティション非負整数のはn(何の繰り返しが許されないので、および順序は重要ではありません)正の整数の集合であるとその合計をn

例えば、図5は、3つの厳格なパーティションを持っています54,13,2

10には10個のパーティションがあります。

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

チャレンジ

n1000未満の非負の整数を指定すると、その厳密なパーティションの数が出力されます。

テストケース:

0 -> 1

42 -> 1426

OEISからの0〜55の厳密なパーティション番号のリストを次に示します。

[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]

これはであるため、バイト単位の最短の解決策が優先されます。

回答:


4

Mathematica、11バイト

PartitionsQ

テストケース

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


3

Haskell、39バイト

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

この関数は(:[0])、数値kをリストに変換します[k,0]。そう、

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

のデカルト積を計算します[1,0],[2,0],...,[n,0]。これは[1..n]、省略された要素を表す0のすべてのサブセットを提供します。の厳密なパーティションnは、sumを使用してそのようなリストに対応しますn。そのような要素は、リストの内包表記によってカウントされlength.filterます。


鮮やかさ!私は自分の答えでsubsequences(+ import)の代わりを探していましたが、今のところ成功しませんでした。
nimi

2

ES6、64バイト

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

再帰的な試行減算で動作します。kは最後に減算された数値であり、次に減算される数値は大きくなければなりません(ただし、それより大きな数値は減算できないほど大きくありません)。常にn自分自身を減算できるため、1が追加されます。(これは再帰的であるため、変数はすべてローカルであることに注意する必要があります。)


2

Python、68バイト

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

n引数として非負の整数を渡して匿名関数を呼び出し...ユニバースの終わりを待ちます。


それを作るn>0、あなたはバイトを保存し、より速く行きます(私はあなたが負の数で再帰すると信じています):P
st0le

また、それまでの速度のこの種をMemoizing
st0le

ifステートメントを次のように変更することはできません:return sum(...)if n else 1
andlrc

@randomraもちろん、もちろん...-
ボブ

1

Python 2、49バイト

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

すべての潜在的加数での再帰の枝kから1nそれが含まれるべきかどうかを決定します。含まれる各加数は、目的の和から減算さnれ、最後に、n=0残っている場合、そのパスがカウントされます。


1

Haskell、43バイト

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

バイナリ関数n%kn最大部分を持つ部分への厳密なパーティションの数を数えるkので、望ましい関数はf n=n%nです。各値はk減少する、含めることができるnことによってk、又は除外、及びいずれかの方法は、新しい最大k再帰を与え、低いものですn%k=n%(k-1)+(n-k)%(k-1)


n%k|q<-k-1=n%q+(n-k)%qひげ剃りライン3のオフバイト
アイザック・ワイス

0

ジュリア、53バイト

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

これは、整数を受け入れて整数を返す匿名関数です。呼び出すには、変数に割り当てます。

を使用して整数パーティションを取得し、個別の加数を持つもののみに配列を作成しpartitionsfilterを使用しcollectて最後のインデックス(長さ)を見つけますendof


0

Haskell、58バイト

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

使用例:map h [0..10]-> [1,1,1,2,2,3,4,5,6,8,10]

これは単純な総当たり的なアプローチです。のすべてのサブシーケンスの合計を確認し1..xます。これは、のために働くx == 0のすべてのサブシーケンスがあるため、あまりにも、[1..0]ある[[]]との合計が[]あります0


0

05AB1E、8 バイト

ÅœʒDÙQ}g

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

Ŝ          # 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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.