교체로 조합 생성


10

n 개의 요소 집합에서 크기가 k 인 대체 (또는 반복이있는 조합)가있는 모든 조합을 나열합니다 .

대체와의 조합은 모든 요소가 n 개의 요소 세트에있는 순서가없는 다중 세트입니다 . 참고 :

  • 순서가 없습니다. 따라서 다른 순서로 이전에 인쇄 된 세트는 다시 인쇄하지 않아야합니다.
  • 다중 집합입니다. 동일한 요소가 두 번 이상 나타날 수 있습니다 (필수는 아님). 이는 대체 조합과 일반 조합의 유일한 차이점입니다.
  • 세트에는 정확히 k 개의 요소 가 있어야합니다 .

대안 적으로, 이는 또한 n 개의 요소 각각을 k 회 포함하는 멀티 세트의 크기 -k 서브 세트이다 .

입력 값은 nk 이며, 여기서 요소는 첫 번째 n 양수 또는 음수가 아닌 정수이거나 n 요소와 k입니다 . 여기서 n 요소가 서로 다르다고 가정 할 수 있습니다 .

출력은 주어진 세트에서 크기 k 로 대체 된 모든 조합의 목록이어야합니다 . 각 요소와 해당 요소를 임의의 순서로 인쇄 할 수 있습니다.

대체품으로 내장 생성 조합을 사용할 수 없습니다. 그러나 내장을 사용하여 정규 조합, 순열, 튜플 등을 생성 할 수 있습니다.

이것은 코드 골프, 최단 코드 승리입니다.

Input: 4 2
Output: [0 0] [0 1] [0 2] [0 3] [1 1] [1 2] [1 3] [2 2] [2 3] [3 3]

답변:


8

젤리, 4 바이트

2 바이트를 절약 한 Sp3000에 감사합니다.

ṗṢ€Q

입력은 n하고 k순서대로 명령 줄 인수로. 에 요소 1를 사용 합니다 n.

온라인으로 사용해보십시오!

설명

ṗ     # Get k-th Cartesion power of n.
 Ṣ€   # Sort each tuple.
   Q  # Remove duplicates.

8

CJam (8 바이트)

{m*:$_&}

온라인 데모

해부

{    e# Declare block (anonymous function); parameters are n k
  m* e# Cartesian product, which implicitly lifts n to [0 1 ... n-1]
  :$ e# Sort each element of the Cartesian product, to give them canonical forms
  _& e# Deduplicate
}

3

Mathematica, 31 29 바이트

2 바이트를 절약 한 A Simmons에게 감사드립니다.

{}⋃Sort/@Range@#~Tuples~#2&

이름없는 함수 촬영 nk순서와 목록의 목록을 반환에 대한 정수 인수로. 요소가 될 것이다 1n. Peter의 CJam 답변과 동일하게 작동합니다.


@ jimmy23013 내가 아는 사람이 없습니다.
Martin Ender

{}∪Sort/@Range@#~Tuples~#2&
A Simmons

@ASimmons 좋은 생각입니다, 감사합니다!
Martin Ender

3

MATL , 11 바이트

( 데카르트 힘을 기반으로 한 9 바이트 솔루션이 있지만 Peter Taylor는 이미 그렇게했습니다 . 다른 것을 시도해보십시오).

교체와의 조합은 다음과 같이 교체없이 조합으로 줄일 수 있습니다. 우리는 원하는 n Cr k과, 예를 들어 n=3, k=2:

0 0
0 1
0 2
1 1
1 2
2 2

우리는 계산할 수 있습니다 n+k-1 C k:

0 1
0 2
0 3
1 2
1 3
2 3

그런 다음 0 1 ... k-1각 행에서 뺍니다 .

+q:2GXn2G:-

설명:

+q     % take two inputs n, k and compute n+k-1
:      % range [1,2...,n+k-1]
2G     % push second input, k
Xn     % combinations without replacement
2G:    % range [1,2,...,k]
-      % subtract with broadcast. Display

이 코드 는 언어 / 컴파일러 13.1.0 릴리스 에서 작동합니다 .

당신은 할 수 있습니다 온라인으로보십시오! 온라인 컴파일러는 14.0.0 릴리스로 업데이트되었으므로 Xn로 변경해야 XN합니다.


3

자바 스크립트 (Firefox 30-57), 71 바이트

f=(n,k)=>k?[for(m of Array(n).keys())for(a of f(m+1,k-1))[...a,m]]:[[]]

keys()한 번만 사용 합니다.


2

루비, 56 55 바이트

놀랍게도 같은 길이의 두 가지 솔루션 :

->n,k{[*1..n].repeated_permutation(k).map(&:sort).uniq}
->n,k{(a=[*1..n]).product(*[a]*(k-1)).map(&:sort).uniq}

이봐, 당신 우리가 순열 내장을 사용할 수 있다고 말했다.

이것은 단순히 모든 반복 순열을 생성하고 (두 번째는 반복 카티 전 곱을 생성 함) 정렬되지 않은 순열을 제거합니다.

0...n-> 1..n!로 바이트를 저장 한 Martin에게 감사합니다 .


1

Pyth, 7 바이트

{SM^UQE

Peter의 답변과 동일한 알고리즘을 사용합니다.

    UQ   range(input())
      E  input()
   ^     repeated Cartesian product of ^^, ^ times
 SM      map(sort)
{        uniq

1

파이썬, 63 바이트

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

재귀 적 방법. 의 MULTISET하려면 k요소 1로를 n, 우리는 하나에 선택 :

  • 의 다른 인스턴스를 포함 n하면에서 여러 k-1요소 를 만들 1수 있습니다.n
  • 수행의 다른 인스턴스를 포함하지 n, 그것은의 MULTISET하게 유지 k까지 요소 1n-1

k또는에 n도달하면 종료 0하고에 k도달 0하면 빈 목록의 기본 사례를 제공합니다. 그렇지 않다면, 우리는 잘못된 수의 요소를 가지고 있으므로 빈 목록을 제공하십시오.


1

파이썬 3, 81 80

재귀 솔루션 :

t=lambda n,k,b=0:[[]]if k<=0 else [[i]+l for i in range(b,n)for l in t(n,k-1,i)]

이 기능은 t(n, k, b)모든 목록 반환 k의 범위의 - 요소 다중 집합 b에를 n. 이 목록은 비어 k <= 0있습니다. 그렇지 않으면, 우리는로 표시되는 다중 서브 세트의 가장 작은 요소를 기준으로 문제를 분류합니다 i.

각각 i의 범위 bn, 우리는 모든 생성 k작은 요소 - 다중 서브 세트 i로 시작하여 [i]각 추가 다음과 (k-1)의 범위의 서브 - 다중을 in우리 재귀 호출에 의해 수득되는 t(n, k-1, i).


프로그래밍 퍼즐 및 코드 골프에 오신 것을 환영합니다! 이것은 좋은 첫 번째 대답입니다. 코드 작동 방식에 대한 설명을 제공해 주시겠습니까?
Alex A.

좋아 보인다. 좋은 해결책!
Alex A.

1

Dyalog APL , 22 바이트

{∪{⍵[⍋⍵]}¨↓⍉⍺⊥⍣¯1⍳⍺*⍵}

⎕IO←0많은 APL 시스템에서 기본값 인이 필요합니다 . k를 왼쪽 인수로, n을 오른쪽 인수로 사용합니다.

⍳⍺*⍵0 1 2 ... kⁿ
⍺⊥⍣¯1베이스 K로 변환하는
전치
리스트의리스트로 만들기 매트릭스
{⍵[⍋⍵]}¨정렬 각 ...
고유


1

J, 18 바이트

[:~.#~<@/:~@#:i.@^

@ Adám의 솔루션에 사용 된 비슷한 접근 방식 .

{24 바이트에 대해 직교 곱을 사용하는 또 다른 접근법 . 소요 k좌변과 n우변에.

~.@:(/:~&.>)@,@{@(#<@i.)

용법

   f =: [:~.#~<@/:~@#:i.@^
   4 f 2
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│0 0│0 1│0 2│0 3│1 1│1 2│1 3│2 2│2 3│3 3│
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘

설명

[:~.#~<@/:~@#:i.@^ Input: n on LHS and k on RHS
                 ^ Compute n^k
              i.@  Create a range [0, 1, ... n^k-1]
    #~             Create k copies on n
            #:     On each value in the range above, convert each digit to base-n
                   and take the last k digits of it
        /:~@       For each array of digits, sort it in ascending order
      <@           Box each array of digits
[:~.               Take the distinct values in the array of boxes and return it

1

클로저, 94 바이트

(defn f[k n](if(= 1 k)(for[i(range n)][i])(sort(set(for[i(f(dec k)n)j(range n)](conj i j))))))

변경된 매개 변수 순서를 참고하십시오 : 1st is k및 2nd is n. 이것은 1 바이트를 절약했습니다 (f(dec k)n).


0

Mathematica, 36 바이트

{##}&~Array~Table@##~Flatten~(#2-1)&

제발 ]의 ... 아니면 ##의 다양한 용도 [없음을 사용하기위한 1/6 보너스 거기 말해?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.