正整数的严格分区


14

OEIS A000009计算整数的严格分区数。甲严格分区一个非负整数的n是一组正整数(因此没有重复是允许的,并且顺序无关紧要),其总和n

例如,5有三个严格分区:54,1,和3,2

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

挑战

给定一个非负整数n<1000,输出其具有的严格分区数。

测试用例:

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]

这是,因此以字节为单位的最短解决方案为准。

Answers:


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是最后减去的数字,下一个要减去的数字必须更大(但不能太大,以至于不能减去更大的数字)。之所以加上1是因为您可以随时减去n自己。(此外,由于这是递归的,因此我必须注意所有变量都是局部变量。)


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作为参数的匿名函数,然后等待Universe的结尾即可。


做到这一点n>0,您节省了一个字节,并且运行得更快(我相信您会用负数递归):P
st0le 2016年

另外,记住这种加快的速度
st0le 2016年

不能将您的if语句更改为:return sum(...)if n else 1
andlrc

@randomra当然,当然……
Bob

1

Python 2,49字节

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

在每一个潜在的加数的递归分支k1n决定它是否应该被包括在内。从所需的总和中减去每个包含的求和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%k计算的严格划分为n最多的部分的数量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]are的所有子序列[[]]以及[]is 的总和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

0

05AB1E,5个字节

LæOQO

在线尝试!

注意:这非常慢,输入大于20时将超时。

说明:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.