求和


15

我很喜欢阅读本网站;这是我的第一个问题。欢迎进行编辑。

给定正整数nm,将m的所有有序分区精确地计算为n个正整数部分,并用逗号和换行符分隔它们。任何顺序都可以,但是每个分区必须恰好出现一次。

例如,给定m = 6和n = 2,可能的分区是对正整数的和,总和为6:

1,5
2,4
3,3
4,2
5,1

请注意,[1,5]和[5,1]是不同的有序分区。输出应与上述格式完全相同,并带有可选的尾随换行符。(编辑:分区的确切顺序无关紧要)。输入/输出通过标准代码高尔夫球I / O进行

m = 7,n = 3的另一个示例输出:

1,1,5
1,2,4
2,1,4
1,3,3
2,2,3
3,1,3
1,4,2
2,3,2
3,2,2
4,1,2
1,5,1
2,4,1
3,3,1
4,2,1
5,1,1

1周后以字节为单位的最小代码获胜。

同样,请根据需要进行编辑。

附录:

@TimmyD询问程序必须支持的整数输入大小。除示例外,没有其他最低要求。实际上,输出大小呈指数增长,粗略地建模为:lines = e ^(0.6282 n-1.8273)。

n | m | lines of output
2 | 1 | 1
4 | 2 | 2
6 | 3 | 6
8 | 4 | 20
10 | 5 | 70
12 | 6 | 252
14 | 7 | 924
16 | 8 | 3432
18 | 9 | 12870
20 | 10 | 48620
22 | 11 | 184756
24 | 12 | 705432

答案是否需要支持任意大的整数,还是像2 ^ 31-1这样的合理上限合适?
AdmBorkBork 2015年

4
术语“集合”令人困惑,因为顺序很重要。我认为您要查找的术语是有序分区。
xnor 2015年

2
尽管没有必要进行更改,但是我们通常会使用比此宽松的输出格式。
lirtosiast,2015年

我更改了您的措辞,以允许通过函数自变量,提示和我们通常认为可接受的其他I / O方法进行I / O。
lirtosiast,2015年

@TimmyD,输出的大小爆炸性地增长,因此尝试将mn超过几百是不现实的,更不用说2 ^ 31-1了。
cuniculus

Answers:


7

Pyth,14个字节

V^SQEIqsNQj\,N

在线尝试:演示测试套件

说明:

V^SQEIqsNQj\,N   implicit: Q = first input number
  SQ             create the list [1, 2, ..., Q]
    E            read another number
 ^               cartesian product of the list
                 this creates all tuples of length E using the numbers in SQ
V                for each N in ^:
     IqsNQ          if sum(N) == Q:
          j\,N         join N by "," and print

也是14个字节,不同的处理方法:jjL\,fqsTQ^SQE
PurkkaKoodari 2015年

6

Python 3,77个字节

def f(n,m,s=''):[f(i,m-1,',%d'%(n-i)+s)for i in range(n)];m|n or print(s[1:])

一个构建每个输出字符串并打印它的递归函数。尝试每个可能的第一个数字,向下递归以找到一个解决方案,该解决方案具有相应的减少的sum n,一个更少的summand m和一个s带有该数字的字符串前缀。如果所需的总和与项数均等于0,则已经达到要求,因此我们将打印结果,并截去初始逗号。这被检查为m|n0(错误)。

Python 2中的79个字符:

def f(n,m,s=''):
 if m|n==0:print s[1:]
 for i in range(n):f(i,m-1,','+`n-i`+s)

4

CJam,22个字节

q~:I,:)m*{:+I=},',f*N*

CJam解释器中在线尝试。

怎么运行的

q~                      Read and evaluate all input. Pushes n and m.
  :I                    Save m in I.
    ,:)                 Turn it into [1 ... I].
       m*               Push all vectors of {1 ... I}^n.
         {    },        Filter; for each vector:
          :+I=            Check if the sum of its elements equals I.
                        Keep the vector if it does.
                ',f*    Join all vectors, separating by commas.
                    N*  Join the array of vectors, separating by linefeeds.

3

Pyth,20 18字节

@Dennis -2个字节!

jjL\,fqQlT{s.pM./E

n作为输入的第一行,而m作为第二行。

在这里尝试。


3

Haskell,68个字节

n#m=unlines[init$tail$show x|x<-sequence$replicate n[1..m],sum x==m]

用法示例:

*Main> putStr $ 2#6
1,5
2,4
3,3
4,2
5,1

工作原理:sequence $ replicate n list创建n绘制形式的元素的所有组合list。我们采取所有x[1..m]sum等于munlinesinit$tail$show产生所需的输出格式。


3

Dyalog APL,33字节

{↑1↓¨,/',',¨⍕¨↑⍺{⍵/⍨⍺=+/¨⍵},⍳⍵/⍺}

注意到m作为左边参数,n作为右边的参数。

几乎一半({和之间)用于所需的格式。


2

Mathematica,65个字节

StringRiffle[Permutations/@#~IntegerPartitions~{#2},"
","
",","]&

IntegerPartitions完成任务。剩下的只是对元组进行排序并格式化结果。


2

Python 3、112

from itertools import*
lambda m,n:'\n'.join(','.join(map(str,x))for x in product(range(m),repeat=n)if sum(x)==m)

我有一段时间没有处理过1班轮了。:)


1

Python 2.7版,174个 170 152字节

胖答案。至少它是可读的:)

import sys,itertools
m=int(sys.argv[1])
for k in itertools.product(range(1,m),repeat=int(sys.argv[2])):
    if sum(k)==m:print str(k)[1:-1].replace(" ","")

您可以>replace,和之后删除逗号前后的空格。
Alex A.

1

朱莉娅105字节

f(m,n)=for u=∪(reduce(vcat,map(i->collect(permutations(i)),partitions(m,n)))) println("$u"[2:end-1])end

该函数读取两个整数参数,然后使用单个尾随换行符将结果写入STDOUT。

取消高尔夫:

function f(m::Integer, n::Integer)
    # Get the integer partitions of m of length n
    p = partitions(m, n)

    # Construct an array of all permutations
    c = reduce(vcat, map(i -> collect(permutations(i)), p))

    # Loop over the unique elements
    for u in unique(c)
        # Print the array representation with no brackets
        println("$u"[2:end-1])
    end
end

0

Perl 6、54字节

如果输出可能是列表列表

{[X] (1..$^m)xx$^n .grep: $m==*.sum} # 36 bytes
my &code = {[X] (1..$^m)xx$^n .grep: $m==*.sum}
say .join(',') for code 7,3;

目前的用词方式是我必须join在lambda中添加a 。

{say .join(',')for [X] (1..$^m)xx$^n .grep: $m==*.sum} # 54 bytes
{...}( 7,3 );
1,1,5
1,2,4
1,3,3
1,4,2
1,5,1
2,1,4
2,2,3
2,3,2
2,4,1
3,1,3
3,2,2
3,3,1
4,1,2
4,2,1
5,1,1
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.