计算N的分区


22

您的挑战很简单:给定一个整数N,输出每个总和为N的正整数列表。例如,如果输入为5,则应输出

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

这些列表不必以任何特定顺序输出,每个列表中的数字也不必。例如,这也是'5'的可接受输出:

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

您可以放心地假设输入将是一个正整数,并且您可以采用任何合理的格式使用此数字。

不得使用任何内置函数来执行此操作。

如果您的程序失败或对于N而言花费的时间太长,这可以,但是您至少必须为前15个产生正确的输出。

存在标准漏洞,最短的答案以字节为单位!

测试IO

1:
[[1]]

2:
[[1, 1], [2]]

3:
[[1, 1, 1], [1, 2], [3]]

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

5:
[[1, 1, 1, 1, 1], [1, 1, 1, 2], [1, 1, 3], [1, 2, 2], [1, 4], [2, 3], [5]]

7:
[[1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 2], [1, 1, 1, 1, 3], [1, 1, 1, 2, 2], [1, 1, 1, 4], [1, 1, 2, 3], [1, 1, 5], [1, 2, 2, 2], [1, 2, 4], [1, 3, 3], [1, 6], [2, 2, 3], [2, 5], [3, 4], [7]]

10:
[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 2], [1, 1, 1, 1, 1, 1, 1, 3], [1, 1, 1, 1, 1, 1, 2, 2], [1, 1, 1, 1, 1, 1, 4], [1, 1, 1, 1, 1, 2, 3], [1, 1, 1, 1, 1, 5], [1, 1, 1, 1, 2, 2, 2], [1, 1, 1, 1, 2, 4], [1, 1, 1, 1, 3, 3], [1, 1, 1, 1, 6], [1, 1, 1, 2, 2, 3], [1, 1, 1, 2, 5], [1, 1, 1, 3, 4], [1, 1, 1, 7], [1, 1, 2, 2, 2, 2], [1, 1, 2, 2, 4], [1, 1, 2, 3, 3], [1, 1, 2, 6], [1, 1, 3, 5], [1, 1, 4, 4], [1, 1, 8], [1, 2, 2, 2, 3], [1, 2, 2, 5], [1, 2, 3, 4], [1, 2, 7], [1, 3, 3, 3], [1, 3, 6], [1, 4, 5], [1, 9], [2, 2, 2, 2, 2], [2, 2, 2, 4], [2, 2, 3, 3], [2, 2, 6], [2, 3, 5], [2, 4, 4], [2, 8], [3, 3, 4], [3, 7], [4, 6], [5, 5], [10]]

超大型测试用例:应该输出15个

[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5], [1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2], [1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4], [1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3], [1, 1, 1, 1, 1, 1, 1, 1, 1, 6], [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3], [1, 1, 1, 1, 1, 1, 1, 1, 2, 5], [1, 1, 1, 1, 1, 1, 1, 1, 3, 4], [1, 1, 1, 1, 1, 1, 1, 1, 7], [1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2], [1, 1, 1, 1, 1, 1, 1, 2, 2, 4], [1, 1, 1, 1, 1, 1, 1, 2, 3, 3], [1, 1, 1, 1, 1, 1, 1, 2, 6], [1, 1, 1, 1, 1, 1, 1, 3, 5], [1, 1, 1, 1, 1, 1, 1, 4, 4], [1, 1, 1, 1, 1, 1, 1, 8], [1, 1, 1, 1, 1, 1, 2, 2, 2, 3], [1, 1, 1, 1, 1, 1, 2, 2, 5], [1, 1, 1, 1, 1, 1, 2, 3, 4], [1, 1, 1, 1, 1, 1, 2, 7], [1, 1, 1, 1, 1, 1, 3, 3, 3], [1, 1, 1, 1, 1, 1, 3, 6], [1, 1, 1, 1, 1, 1, 4, 5], [1, 1, 1, 1, 1, 1, 9], [1, 1, 1, 1, 1, 2, 2, 2, 2, 2], [1, 1, 1, 1, 1, 2, 2, 2, 4], [1, 1, 1, 1, 1, 2, 2, 3, 3], [1, 1, 1, 1, 1, 2, 2, 6], [1, 1, 1, 1, 1, 2, 3, 5], [1, 1, 1, 1, 1, 2, 4, 4], [1, 1, 1, 1, 1, 2, 8], [1, 1, 1, 1, 1, 3, 3, 4], [1, 1, 1, 1, 1, 3, 7], [1, 1, 1, 1, 1, 4, 6], [1, 1, 1, 1, 1, 5, 5], [1, 1, 1, 1, 1, 10], [1, 1, 1, 1, 2, 2, 2, 2, 3], [1, 1, 1, 1, 2, 2, 2, 5], [1, 1, 1, 1, 2, 2, 3, 4], [1, 1, 1, 1, 2, 2, 7], [1, 1, 1, 1, 2, 3, 3, 3], [1, 1, 1, 1, 2, 3, 6], [1, 1, 1, 1, 2, 4, 5], [1, 1, 1, 1, 2, 9], [1, 1, 1, 1, 3, 3, 5], [1, 1, 1, 1, 3, 4, 4], [1, 1, 1, 1, 3, 8], [1, 1, 1, 1, 4, 7], [1, 1, 1, 1, 5, 6], [1, 1, 1, 1, 11], [1, 1, 1, 2, 2, 2, 2, 2, 2], [1, 1, 1, 2, 2, 2, 2, 4], [1, 1, 1, 2, 2, 2, 3, 3], [1, 1, 1, 2, 2, 2, 6], [1, 1, 1, 2, 2, 3, 5], [1, 1, 1, 2, 2, 4, 4], [1, 1, 1, 2, 2, 8], [1, 1, 1, 2, 3, 3, 4], [1, 1, 1, 2, 3, 7], [1, 1, 1, 2, 4, 6], [1, 1, 1, 2, 5, 5], [1, 1, 1, 2, 10], [1, 1, 1, 3, 3, 3, 3], [1, 1, 1, 3, 3, 6], [1, 1, 1, 3, 4, 5], [1, 1, 1, 3, 9], [1, 1, 1, 4, 4, 4], [1, 1, 1, 4, 8], [1, 1, 1, 5, 7], [1, 1, 1, 6, 6], [1, 1, 1, 12], [1, 1, 2, 2, 2, 2, 2, 3], [1, 1, 2, 2, 2, 2, 5], [1, 1, 2, 2, 2, 3, 4], [1, 1, 2, 2, 2, 7], [1, 1, 2, 2, 3, 3, 3], [1, 1, 2, 2, 3, 6], [1, 1, 2, 2, 4, 5], [1, 1, 2, 2, 9], [1, 1, 2, 3, 3, 5], [1, 1, 2, 3, 4, 4], [1, 1, 2, 3, 8], [1, 1, 2, 4, 7], [1, 1, 2, 5, 6], [1, 1, 2, 11], [1, 1, 3, 3, 3, 4], [1, 1, 3, 3, 7], [1, 1, 3, 4, 6], [1, 1, 3, 5, 5], [1, 1, 3, 10], [1, 1, 4, 4, 5], [1, 1, 4, 9], [1, 1, 5, 8], [1, 1, 6, 7], [1, 1, 13], [1, 2, 2, 2, 2, 2, 2, 2], [1, 2, 2, 2, 2, 2, 4], [1, 2, 2, 2, 2, 3, 3], [1, 2, 2, 2, 2, 6], [1, 2, 2, 2, 3, 5], [1, 2, 2, 2, 4, 4], [1, 2, 2, 2, 8], [1, 2, 2, 3, 3, 4], [1, 2, 2, 3, 7], [1, 2, 2, 4, 6], [1, 2, 2, 5, 5], [1, 2, 2, 10], [1, 2, 3, 3, 3, 3], [1, 2, 3, 3, 6], [1, 2, 3, 4, 5], [1, 2, 3, 9], [1, 2, 4, 4, 4], [1, 2, 4, 8], [1, 2, 5, 7], [1, 2, 6, 6], [1, 2, 12], [1, 3, 3, 3, 5], [1, 3, 3, 4, 4], [1, 3, 3, 8], [1, 3, 4, 7], [1, 3, 5, 6], [1, 3, 11], [1, 4, 4, 6], [1, 4, 5, 5], [1, 4, 10], [1, 5, 9], [1, 6, 8], [1, 7, 7], [1, 14], [2, 2, 2, 2, 2, 2, 3], [2, 2, 2, 2, 2, 5], [2, 2, 2, 2, 3, 4], [2, 2, 2, 2, 7], [2, 2, 2, 3, 3, 3], [2, 2, 2, 3, 6], [2, 2, 2, 4, 5], [2, 2, 2, 9], [2, 2, 3, 3, 5], [2, 2, 3, 4, 4], [2, 2, 3, 8], [2, 2, 4, 7], [2, 2, 5, 6], [2, 2, 11], [2, 3, 3, 3, 4], [2, 3, 3, 7], [2, 3, 4, 6], [2, 3, 5, 5], [2, 3, 10], [2, 4, 4, 5], [2, 4, 9], [2, 5, 8], [2, 6, 7], [2, 13], [3, 3, 3, 3, 3], [3, 3, 3, 6], [3, 3, 4, 5], [3, 3, 9], [3, 4, 4, 4], [3, 4, 8], [3, 5, 7], [3, 6, 6], [3, 12], [4, 4, 7], [4, 5, 6], [4, 11], [5, 5, 5], [5, 10], [6, 9], [7, 8], [15]]

目录

这篇文章底部的Stack Snippet会根据答案a)生成目录,a)作为每种语言最短解决方案的列表,b)作为整体排行榜。

为确保您的答案显示出来,请使用以下Markdown模板以标题开头。

## Language Name, N bytes

N您提交的文件大小在哪里。如果您提高了分数,则可以将旧分数保留在标题中,方法是将它们打掉。例如:

## Ruby, <s>104</s> <s>101</s> 96 bytes



2
您能澄清一下手柄的意思吗?
丹尼斯

@flawr我不同意-查找所有分区与查找严格分区是完全不同的。但是,可能是一个欺骗目标。
Mego 2016年

我认为寻找无序分区并且不限制部件数量使这种区别变得足够大。
xnor

你能澄清一下布廷的意思吗?
Leaky Nun

Answers:


6

Pyth,10个 9字节

{SMlMM./U

不太确定这是否作弊,但是规则只说一个不能使用整数分区(在问题本身中没有明确说明,但是问题中OP的评论说是整数分区)。我正在使用字符串 列表分区,它使列表的各个部分连接到“母亲”列表。我相信我必须感谢@Maltysen使用列表而不是字符串的想法。

n = 15在我的机器上花费不到一秒钟。

在数据流伪代码中:

              input       // initial data
        U     range       // makes a list of length equal to input
      ./      partition   // partitions string
   lMM        length      // length of each substring in each way to partition
 SM           sort        // sort each way to partition
{             deduplicate // removes all duplicate after sorting
              print       // implicit, output final result

在这里在线尝试。


{mSlMd./*N保存一个字节
Leaky Nun

如果您使用列表分区而不是字符串分区,则可以使用7个字节:pyth.herokuapp.com/?code=sMM
2Fm1

@LeakyNun好吧,我实际上尝试过了,它没有保存一个字节。当我看到您的评论时,我发现我的答案实际上是10个字节,所以我实际上记错了(忘了gedit块从1开始)。
busukxuan '16

@Maltysen您需要对每个子列表进行排序,然后进行重复数据删除。
busukxuan '16

@Maltysen是的,使用列表确实可以缩短它。我尝试将排序和重复数据删除添加到链接到的代码中,但没有帮助,但是全凭您的支持,我有了用*替换* N的想法。谢谢!
busukxuan '16

6

Pyth,18个字节

L?b{SM+R-bsdsyMb]Y

在线尝试!y末尾的用于调用函数)

这是相当快的。

这使用递归。如果输入的是b,我的方法会产生分区从0b-1,然后生成每个正确的分区。

例如,当b=4

  • b=0[[]]
  • b=1[[1]]
  • b=2[[2], [1, 1]]
  • b=3[[3], [1, 2], [1, 1, 1]]

然后,将中的每个分区b=0附加4到(使总和为4);到中的每个分区b=1,追加3(以求和4);等等

这主要是它的工作方式。

L?b{SM+R-bsdsyMb]Y

L                    define a function called "y" which takes an argument: "b"
 ?b                  test for truthiness of b (in this case, test if b>0).


   {SM+R-bsdsyMb     if truthy:

             yMb         call this function from 0 to b-1.
            s            unpack each list of partitions, generating only partitions.
      +R                 to each partition (d), append:
        -                    the difference of
         b                   b (the argument) and
          sd                 the sum of d (the partition).
    SM                   sort each partition.
   {                     remove duplicates.


                ]Y   if falsey:

                 Y       yield [].
                ]        yield [[]].

5

MATL,20字节

:"0Gq:@XNG3$Yc!dS!Xu

在线尝试!

15在在线编译器中,输入大约需要2秒钟。

说明

这通过生成分区然后转换为分区长度来起作用。我的意思是以下内容。给定输入N = 5,可能的分区为[2 2 1]。这由分区点[0 2 4 5]表示,因此分区点的连续差(或长度)会给出输入数字的最终分区。

所有分区点数组均以0开头,以N结束。中间点的数量k从0到N -1。对于给定的Nk,中间点可以作为一次取k的数字[1、2,...,N -1] 的组合生成。

几个分割点阵列可能会以不同的顺序产生相同的结果。例如,分区点[0 1 3 5]将给出分区长度[1 2 2],即与前一个[2 2 1]相同,只是顺序不同。必须通过每个分区长度数组进行排序删除重复项来考虑这一点

:        % Implicitly input N. Push [1 2 ... N]. These are the possible values of k,
         % except with N instead of 0
"        % For each
  0      %   Push 0
  Gq:    %   Push [1 ... N-1]. These the possible intermediate points
  @XN    %   Push k and produce the combinations. Each k produces a 2D array with
         %   each combination on a row. The value k=N produces an empty array
  G      %   Push N
  3$Yc   %   Prepend a column of zeros and append a column of N to the array
  !d     %   Transpose. Consecutive differences of each column
  S!     %   Sort each column. Transpose
  Xu     %   Keep only unique rows
         % Implicitly end for and display all arrays in the stack

1
很好,分区点的概念是解决此问题的非常聪明的方法。
尼克

@尼克谢谢!欢迎来到(活跃于)本网站!:-)
Luis Mendo


5

J,49 42 36 35 32字节

a:1&([:~.@,(,;}./:~@,(+{.))&>)~]

现在是默认的!

的生成的整数分区Ñ通过构建整数分区从1到Ñ。计算n的结果以毫秒为单位 = 15。

[[1]]对应于n = 1 的初始整数分区开始,通过结合两个操作的结果来构造下一个整数分区:将1附加到每个分区;在每个分区中将最小值增加1。当然,重复的分区将被删除。要获得n = 2及以上的整数分区,

Partition for n = 1
[[1]]

Partition for n = 2
[[1, 1]] join [[2]]
= [[1, 1], [2]]

Partition for n = 3
[[1, 2], [1, 1, 1]] join [[3], [1, 2]]
= [[3], [1, 2], [1, 1, 1]]

... and so on

用法

   f =: a:1&([:~.@,(,;}./:~@,(+{.))&>)~]
   f 1
┌─┐
│1│
└─┘
   f 2
┌───┬─┐
│1 1│2│
└───┴─┘
   f 3
┌─────┬───┬─┐
│1 1 1│1 2│3│
└─────┴───┴─┘
   f 5
┌─────────┬───────┬─────┬───┬─────┬───┬─┐
│1 1 1 1 1│1 1 1 2│1 2 2│2 3│1 1 3│1 4│5│
└─────────┴───────┴─────┴───┴─────┴───┴─┘
   # f 15
176

说明

由于J不支持参差不齐的数组,因此每个分区都必须装箱,以便在附加到其他分区时不会被零填充。

a:1&([:~.@,(,;}./:~@,(+{.))&>)~]  Input: n
a:                                The empty box
                               ]  Get the input n
  1&(                        )~   Repeat n times with an initial array of one empty box
           (              )&>       Operate on each partition
                     (   )            Hook a partition
                       {.               Get its head (the smallest value)
  1                   +                 Add 1 to it
  1           }.                      Drop the first value in each partition
                    ,                 Join the previous two results
                /:~@                  Sort it
  1         ,                         Prepend a 1 to the initial partition
             ;                        Box the last two results and join them
     [:   ,                         Flatten the pairs of boxes
       ~.@                          Remove duplicates and return
                                  Return the final result where each box
                                  is a partition of n

4

Python,65个字节

Python 3

def f(n,i=1,l=[]):n or print(l);i>n or[f(n-i,i,[i]+l),f(n,i+1,l)]

此功能会累积一个分区并打印输出,并根据选择进行分支。它决定将多少个1放入分区,多少个2,依此类推。对于每个值i,要么

  • 添加大小的一部分i,并减小nn-i
  • 移至 i+1

如果为i>n,则无法再制造零件,因此停止。如果n降至0,则分区成功,因此被打印。

Python 2

f=lambda n,i=1:n/i and[l+[i]for l in f(n-i,i)]+f(n,i+1)or[[]][n:]

一种输出分区列表的递归方法。与Python 3代码一样,它会计算零件尺寸,i并在每个步骤中决定是增加尺寸的另一部分i还是停下来。

两者n=15几乎都是立即执行的。


3

Javascript,194个字节

p=n=>{var a=[];for(var i=1;i<=n-i;i+=1){for(v of p(n-i)){v.push(i);a.push(v.sort())}}a.push([n]);return a};n=5;s=p(n).map(v=>JSON.stringify(v));s=s.filter((v,i)=>s.indexOf(v)==i);console.log(s);

未缩小

通过对字符串进行排序和比较来查找唯一性是很不容易的事,但可能会节省空间。

p = n => {
    var a = [];

    for (var i = 1; i <= n-i; i++)
    {
        for (v of p(n-i)) {
            v.push(i);
            a.push(v.sort());
        }
    }

    a.push([n]);

    return a;
}

n = 5;
s = p(n).map(v =>  JSON.stringify(v));
s = s.filter((v,i) => s.indexOf(v) == i);
console.log(s);

4
Quite a hack but saves space这正是该网站的目的。:D
DJMcMayhem

2

Python 3.5、82 72字节

f=lambda n:{(*sorted([*p,i]),)for i in range(1,n)for p in f(n-i)}|{(n,)}

返回一组元组。n = 15立即完成。

repl.it对其进行测试。


2

Haskell,44个字节

0%m=[[]]
n%m=[j:r|j<-[m..n],r<-(n-j)%j]
(%1)

辅助功能n%m将划分为n多个部分≥m,主要功能使用m=1。它每个第一条目的分支jm≤j≤n,递归上的其余分区n-j成至少部分j。基本情况n==0仅给出空分区。



1

果冻,9 个字节

b1ŒṖḅ1Ṣ€Q

在线尝试!

怎么运行的

b1ŒṖḅ1Ṣ€Q  Main link. Argument: n (integer)

b1         Convert n to unary, i.e., a list A of n 1's.
  ŒṖ       Generate all partitions of the list A.
    ḅ1     Convert each flat list from unary to integer.
      Ṣ€   Sort each resulting list.
        Q  Unique; deduplicate the lists.

1

J,39个字节

[:~.i.<@\:~@(#;.1~"1 0)1,@{@;(<1 0)#~<:

这是一个单数动词,它使用一个整数并返回一个由盒装数组组成的数组。在这里尝试。用法:

   p =: [:~.i.<@\:~@(#;.1~"1 0)1,@{@;(<1 0)#~<:
   p 3
+-----+---+-+
|1 1 1|2 1|3|
+-----+---+-+

在输入15上,它在我的机器上运行了大约一秒钟。

说明

这个挑战立即看起来像是Catalog({)和Cut(;.)的工作。该算法的概述是:

  • 产生所有0-1长度的数组n
  • 对于每一个,n沿着1s 剪切一个虚拟长度数组,并列出每个部分的长度。
  • 对长度进行排序,然后从结果中删除重复的数组。

显然,路易斯·门多也有同样的想法

代码说明:

[:~.i.<@\:~@(#;.1~"1 0)1,@{@;(<1 0)#~<:   Input is n.
                                     <:   n-1
                                   #~     copies of
                             (<1 0)       the boxed array [1 0].
                       1    ;             Prepend the boxed array [1].
                          {@              Catalog: produces all combinations of taking one
                                          item from each box, in a high-dimensional matrix.
                        ,@                Flatten the matrix. This results in a list of all
                                          boxed 0-1 arrays of length n that begin with a 1.
    i.                                    The array A =: 0, 1, ..., n-1.
            (     "1 0)                   For each of the boxed arrays B:
              ;.1~                          cut A along the occurrences of 1s in B,
             #                              take the length of each part,
        \:~@                                sort the lengths,
      <@                                    and put the result in a box.
[:~.                                      Remove duplicate boxes.

;.再次很好地使用cut 。
英里

1

Brachylog,33字节(非竞争)

:1f:oad.
:1eI,.##lI,.:{.>0}a+?,.=

由于存在错误修复,因此无法进行竞争。

15在我的机器上,这大约需要1秒钟。对于20和更大的崩溃这与Out of global stack例外。

说明

这不使用任何内置的分区,而是使用+通过约束传播双向运行的事实。

  • 主要谓词:

    :1f                       Find the list of all valid outputs of predicate 1
       :oa                    Sort each element of that list
          d.                  Output is that list of sorted lists minus all duplicates
    
  • 谓词1:

    :1eI                      I is an integer between Input and 1
        .##lI,                Output is a list of length I
              .:{.>0}a        Elements of Output are integers greater than 0
                      +?,     The sum of the elements of Output is Input
                         .=   Assign values to the elements of Output
    

1

Mathematica,62 54字节

Inner[#2~Table~#&,FrobeniusSolve[r=Range@#,#],r,Join]&

整数n的分区可以通过求解n个非负整数(c 1c 2,...,c n)的元组来找到,使得c 1 + 2 c 2 + ... + n c n = nFrobeniusSolve我们能够找到这个方程的所有解,用来创建它们各自值的许多副本,以便找到n的所有整数分区。


...这是不是内置的?
Leaky Nun

@LeakyNun FrobeniusSolve找不到整数分区,它找到给定形式为和的方程的非负整数的 所有解。x1 ... xNa1 x1 + a2 x2 + ... aN xN = ba1 ... aNb
英里

0

的JavaScript (Firefox 30-57)79 ES6,65字节

f=(n,m=1,a=[])=>n?m>n?[]:[...f(n-m,m,[...a,m]),...f(n,m+1,a)]:[a]

@xnor的Python解决方案的端口。(如果只有我发现您可以递归m以及n...)

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.