和のセットを見つける


15

このサイトを読んで楽しんできました。これが私の最初の質問です。編集は大歓迎です。

正の整数を考えると、NMのすべての注文のパーティション計算メートルを正確にn個の部品の正の整数部分、およびそれらを印刷には、カンマと改行で区切られました。どの順序でも構いませんが、各パーティションは1回だけ表示される必要があります。

たとえば、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

4
順序が重要であるため、「セット」という用語は混乱を招きます。お探しの用語は、パーティションの順序付けです。
xnor

2
変更する必要はありませんが、通常はこれよりも緩やかな出力形式を使用します。
リルトシアスト

関数の引数、プロンプト、および通常受け入れられると考えられる他のI / Oメソッドを通じてI / Oを許可するように、文言を変更しました。
リルトシアスト

@TimmyD、出力のサイズはかなり爆発的に増大するため、2 ^ 31-1は言うまでもなく、mnを数百を超えて試すことは実用的ではありません。
cuniculus

回答:


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

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:])

各出力文字列を作成して出力する再帰関数。すべての可能な最初の数を試行し、対応する減少した合計を持つ解を見つけるために下に再帰しますnと1つ少ないm、およびsその数値を持つ文字列プレフィックスを持つ。必要な合計と用語の数の両方が0である場合、マークにヒットしているため、結果を出力し、最初のコンマを切り捨てます。これはm|n0(Falsey)としてチェックされます。

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 2番目のとして使用されます。

ここで試してみてください


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すべての組み合わせを作成します。私たちは、そのようなすべて取るのどこ等しいです。必要な出力形式を生成します。nlistx[1..m]summunlinesinit$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

パイソン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ます。
アレックスA.

1

ジュリア、105バイト

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

これは、2つの整数引数を読み取り、単一の末尾改行で結果を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、ラムダに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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.