합계 세트 찾기


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는 프로그램이 지원해야하는 정수 입력의 크기를 물었습니다. 예제를 넘어서는 최소한의 노력은 없습니다. 실제로 출력 크기는 line = 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
변경할 필요는 없지만 일반적으로 이보다 출력 형식이 느립니다.
lirtosiast

함수 인수, 프롬프트 및 일반적으로 허용되는 다른 I / O 방법을 통해 I / O를 허용하도록 문구를 변경했습니다.
lirtosiast

@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

파이썬 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 ms해당 숫자 의 문자열 접두사 가 있는 솔루션을 찾기 위해 반복합니다 . 필요한 합계와 항의 수가 모두 0이면 마크에 도달 한 것이므로 결과를 인쇄하여 초기 쉼표를 잘라냅니다. 이것은 m|n0 (Falsey) 으로 확인됩니다 .

파이썬 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

하스켈, 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

파이썬 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

파이썬 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

펄 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대로 람다에을 추가해야합니다 .

{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.