我有几个分区?


16

正整数的分区号定义为可将其表示为正整数之和的方式数。换句话说,它具有整数分区的数量。例如,数字4具有以下分区:

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

因此,它具有5分区。这是OEIS A000041


任务

给定正整数N,确定其分区号。

  • 所有标准规则均适用。

  • 输入和输出可以通过任何合理的方式进行处理。

  • 这是,因此以字节为单位的最短代码获胜。


测试用例

输入| 输出量

1 | 1个
2 | 2
3 | 3
4 | 5
5 | 7
6 | 11
7 | 15
8 | 22
9 | 30
10 | 42

1
我几乎肯定这是重复的...
DJMcMayhem

@DJMcMayhem嗯,好的。如果您找到重复的邮件,请告诉我。抱歉,这是我的新手!

1
@DJMcMayhem也许您问了这个问题,因为这是从“生成”到“计数”的一小步,但是您不必生成所有分区来对其进行计数……
Giuseppe

1
是一个伪造的,除了是popcon(?)以外,因为太宽而关闭。恕我直言,这是更好的书面方式,应该保持打开状态,而旧的应该以欺骗的方式(重新打开和关闭)
Rod

2
@Rod,这是一个糟糕的流行骗局,但是将接近的原因切换为欺骗不会有任何改善。性能要求会给移植一些答案带来障碍(几分钟之内没人会生成 24061467864032622473692149727991的1000个分区);而且Hardy-Ramanujan-Rademacher的实现方式并非一帆风顺……但是,值得在meta中展开一个讨论,以解决该问题以及该问题。
彼得·泰勒

Answers:


13

Pyth,3个字节

l./

在这里尝试!尝试测试套件。

答案比格式化代码本身花费更长的时间:P。


怎么样?

Pyth是完成这项工作的正确工具。

l。/带有隐式输入的完整程序。

 ./整数分区。返回所有添加到输入的正整数排序列表。
l长度
      隐式输出结果。



8

Emojicode 0.5,204个 201字节

🐋🚂🍇🐖🅰️➡🚂🍇🍊⬅🐕1🍇🍎1🍉🍮s 0🔂k⏩0🐕🍇🍦t➖🐕k🍮r t🔂i⏩1 t🍇🍊😛🚮t i 0🍇🍮➕r i🍉🍉🍮➕s✖r🅰️k🍉🍎➗s🐕🍉🍉

在线尝试!

通过使用“小于或等于1”而不是“小于2”来获得-3个字节,因为“小于”表情符号具有相当长的UTF-8编码。还进行t了冻结以使警告静音而不影响字节数。

用名为🅰️的方法扩展🚂(整数)类。您可以编写一个简单的程序,该程序从输入中获取一个数字,然后在数字上调用🅰️并输出如下结果:

🏁🍇
 🍦str🔷🔡😯🔤Please enter a number🔤
 🍊🍦num🚂str 10🍇
  😀🔡🅰️num 10
 🍉🍓🍇
  😀🔤Learn what a number is, you moron!🔤
 🍉
🍉

可以通过省略消息和错误处理来进行很多操作,但是它不包含在乐谱中,因此我宁愿显示Emojicode的更多功能,同时在整个过程中提高可读性。

不打高尔夫球

🐋🚂🍇
 🐖🅰️➡🚂🍇
  🍊◀️🐕2🍇
   🍎1
  🍉
  🍮sum 0
  🔂k⏩0🐕🍇
   🍦nmk➖🐕k
   🍮sig nmk
   🔂i⏩1 nmk🍇
    🍊😛🚮nmk i 0🍇
     🍮➕sig i
    🍉
   🍉
   🍮➕sum✖sig🅰️k
  🍉
  🍎➗sum🐕
 🍉
🍉

说明

注意:在emojicode 0.5中,很多表情符号选择没有太大意义。毕竟是0.x。0.6将解决此问题。

Emojicode是一种面向对象的编程语言,具有泛型,协议,可选和闭包,但是该程序不使用闭包,并且所有泛型和协议都可以视为隐式的,而唯一的可选出现在I / O存根中。

该程序仅适用于以下几种类型:🚂是整数类型,🔡是字符串类型,⏩是范围类型。也会出现一些布尔值(👌),但它们仅在条件中使用。布尔值可以取👍或👎的值,分别对应于true和false。

Emojicode当前没有运算符,因此通常作为运算符的加法,比较和其他运算均作为函数实现,从而有效地使表达式使用前缀表示法。运营商也计划在0.6。

让我们首先解决测试程序。

🏁

这是🏁块,可以与其他语言的main块进行比较。

🍇 ... 🍉

葡萄和西瓜在emojicode中声明代码块。

🍦str🔷🔡😯🔤Please enter a number🔤

这将声明一个名为“ frozen”的名称str,并将其值设置为使用初始化程序(构造函数)😯创建的新字符串,该字符串以提示符作为字符串,然后从用户输入一行。为什么使用冻结而不是变量?它不会改变,因此变量将发出警告。

🍊🍦num🚂str 10

让我们分解一下。🚂str 10str带有参数10 的冻结对象上调用🚂方法。按照约定,以类型名称命名的方法会将对象转换为该类型。10是用于整数转换的基数。此方法返回可选的🍬🚂。可选参数可以包含基本类型的值,也可以包含虚无的⚡。当字符串不包含数字时,返回⚡。要使用该值,必须使用un解开可选值,如果值是⚡,则会引发运行时错误。因此,优良作法是在展开可选组件之前检查是否没有内容。实际上,是如此普遍,以至于Emojicode有一个简写形式。通常,🍊是一个“如果”。🍊🍦 variable expression表示:评估表达式。如果可选内容不包含任何内容,则条件的计算结果为👎(假)。否则,将variable使用可选的未包装值创建一个冻结的named ,条件的计算结果为👍(true)。因此,在正常使用情况下,将🍇 ... 🍉输入条件之后的块。

😀🔡🅰️num 10

🅰️是主代码使用adds来计算分区数的方法。这会num在条件语句中声明的冻结对象上调用🅰️,并通过🔡方法使用以10为底的结果将其转换为字符串。然后,😀打印结果。

🍓🍇 ... 🍉

🍓的意思是“ else”,因此当用户未正确输入数字时,将输入此块。

😀🔤Learn what a number is, you moron!🔤

打印字符串文字。

现在,让我们看一下主程序。我将解释非高尔夫版本;高尔夫版本只是删除了空格,并将变量重命名为单个字母名称。

🐋🚂🍇 ... 🍉

扩展🚂类。这是编程语言中不常见的功能。会直接修改。,而不是创建以🚂作为超类的新类。

🐖🅰️➡🚂🍇 ... 🍉

创建一个名为🅰️的新方法,该方法返回一个🚂。它返回使用公式计算的分区数a(n) = (1/n) * Sum_{k=0..n-1} sigma(n-k)*a(k)

🍊⬅🐕1🍇
 🍎1
🍉

🐕与其他语言相似thisself来自其他语言,并且指代调用该方法的对象。此实现是递归的,因此这是终止条件:如果调用此方法的数字小于或等于1,则返回1。

🍮sum 0

创建一个新变量sum并将其设置为0。隐式假定类型为🚂。

🔂k⏩0🐕

over迭代实现🔂🐚⚪️协议的任何内容,而⏩是恰好实现🔂🐚🚂的范围文字。一个范围具有一个起始值,一个终止值和一个步进值,如果为start < stop,则假定为1 ,否则为-1。也可以通过使用⏭创建范围文字来指定步长值。开始值是包含的,而停止值是排他性的,所以这是相当于for k in range(n)Sum_{k=0..n-1}在公式中。

🍦nmk➖🐕k

我们需要计算sigma(n-k)或n - k换言之的除数之和,并且该参数需要几次,因此将其存储n - k在变量中nmk以节省一些字节。

🍮sig nmk
🔂i⏩1 nmk

这会将sig变量设置为sigma的参数,并迭代从1到的所有数字nmk - 1。我可以将变量初始化为0并在1..nmk上进行迭代,但是这样做更短。

🍊😛🚮nmk i 0

s计算余数,即模数,然后😛检查是否相等,因此条件是👍如果i是的除数nmk

🍮➕sig i

这是通过呼叫进行的分配,类似于+= -= >>=某些次等的无表情符号语言中的操作员系列。这行也可以写成🍮 sig ➕ sig i。因此,在内循环完成后,sig将包含n - k或的除数之和。sigma(n - k)

🍮➕sum✖sig🅰️k

通过调用进行另一项分配,因此这sigma(n - k) * A(k)与公式中的总和相同。

🍎➗sum🐕

最后,将总和除以n并返回商。这种解释可能花费了编写代码本身三倍的时间。



3

八度,18字节

partcnt(input(''))

使用内置函数partcnt。

通过使用@使用匿名函数无法正确完成操作,将不胜感激。


3

视网膜,34字节

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

%O`1+
@`.+

在线尝试!

说明

.+
$*

将输入转换为一元。

+%1`\B
;$'¶$`,

这将计算一进制数字列表的所有2 n-1个分区。我们通过重复(+)匹配每行()中的第一个(1)非单词边界(\B即两个1s 之间的位置%),并将其替换为;,其后的所有内容($'),换行符(),它($`)和,。例:

1;1,111

成为

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

其中v标记结果为$'^标记结果$`。这是一个常见的习惯用法,可同时获得两个不同的替换结果(我们基本上同时插入;和和,,以及缺失的字符串“一半”以完成两个完整的替换)。

我们会将其;视为实际分区,并,视为占位符,以防止后续内容\B在那里匹配。那下...

,

...我们删除那些逗号。这样就给了我们所有的分区。例如,对于输入,4我们得到:

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

不过,我们并不关心订单:

%O`1+

这样会1在每行中对s 的运行进行排序,以便获得无序分区。

@`.+

最后,我们计算的唯一(@)匹配项.+,即我们获得了多少个不同的行/分区。我在@很久以前就添加了此选项,然后完全忘记了它,直到最近才重新发现它。在这种情况下,与进行第一次重复数据删除相比,它节省了一个字节D`


3

Python 2中54 53个字节

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

在线尝试!

怎么运行的

n的每个分区都可以表示为列表x = [x 1,x,x m ],这样x 1 + x + x m = n。如果我们要求这种表示成为独特的X 1 ≤⋯≤X

我们定义一个辅助函数F(N,k)的该计数与下界分区ķ,即,列出了X为使得X 1 +⋯+ X = Nķ≤X 1 ≤⋯≤X 。对于输入n,质询因此要求输出f(n,1)

对于正整数nk,使得k≤n,至少有一个下限为k的分区:单例列表[n]。如果n = k(尤其是n = 1),则这是唯一合格的分区。另一方面,如果k> n,则根本没有解。

如果k <n,我们可以通过从左到右构建剩余分区来递归计算剩余分区,如下所示。对于每个Ĵ使得ķ≤Ĵ≤n / 2个,我们可以建立分区[X 1,⋯,X ] = [J,Y 1,⋯,Y m-1个 ]。我们有x 1 +⋯+ x m当且仅当y 1 +⋯+ y m-1 = n-j时, = n。此外,X 1 ≤⋯≤X 当且仅当Ĵ≤ÿ 1 ≤⋯≤ÿ m-1个

因此,以j开头的n的分区x可以计算为f(n-j,j),它计算有效分区y。通过要求 j≤n / 2,我们确保j≤n-j,因此至少有一个y。我们可以这样计算所有的分区Ñ通过求和1(为[N] )和( - ,j将Ñ)的F为的所有有效值Ĵ

该代码是数学函数f的直接实现。另外,它使k默认为1,因此f(n)计算输入nf(n,1)值。


哇,这太不可思议了!您能补充一下它的工作原理吗?

我已经编辑了答案。如果有任何不清楚的地方,请告诉我。
丹尼斯

3

J37 35字节

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

在线尝试!

说明

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

我很傻,很傻,想发表解释吗?
科尔

1
@cole这是一种迭代方法,从p(0)= 1的解开始,然后使用公式构建下一个p(n) = sum(sigma(n-k) * p(k) for k = 0 to n-1) / n。当我认为不能明显缩短代码时,我将在后面对代码进行解释。
英里

2

JavaScript中,125个 121字节

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

在线尝试!

警告:时间和空间的复杂性是指数级的。大量工作非常缓慢。


2

Python 2,89个字节

Xcoder先生-9个字节notjagan -1个字节

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)}

在线尝试!



@ Mr.Xcoder甚至都不知道,为什么我不使用lambda D:
Dead Possum,

呵呵,¯\_(ツ)_/¯-顺便说一句,如果你想保持它的完整功能,您就不需要变量,94个字节
Xcoder先生

@ Mr.Xcoder是的..在离开codegolf一段时间后,我感到生锈了:c
Dead Possum



0

Java 8(229字节)

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;};}

取消高尔夫:

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

果冻,3个字节

Œṗ原子最近已添加,它的意思是“整数分区”。

ŒṗL

在线尝试!

ŒṗL-完整程序。

Œṗ-整数分区。
  L-长度。
      -隐式输出。


0

JavaScript ES7,69字节

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字节

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

时间复杂度O(n ^ n),所以要小心(我的计算机上出现了明显的延迟F(6)

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.