Tạo kết hợp với thay thế


10

Liệt kê tất cả các kết hợp có thay thế (hoặc kết hợp với sự lặp lại) có kích thước k từ một tập hợp n phần tử.

Một sự kết hợp với sự thay thế là một multiset không có thứ tự mà mọi phần tử trong nó cũng nằm trong tập hợp n phần tử. Lưu ý rằng:

  • Nó không có thứ tự. Vì vậy, một bộ được in trước đó với một thứ tự khác không nên được in lại.
  • Nó là một multiset. Phần tử tương tự có thể (nhưng không bắt buộc) xuất hiện nhiều lần. Đây là sự khác biệt duy nhất giữa sự kết hợp với sự thay thế và sự kết hợp bình thường.
  • Bộ nên có chính xác k phần tử.

Ngoài ra, nó cũng là một tập hợp con size k của multiset chứa mỗi phần tử n lần k .

Đầu vào phải là nk , trong đó các phần tử là n số nguyên dương hoặc không âm đầu tiên , hoặc n phần tử và k , trong đó bạn có thể giả sử các phần tử n khác nhau.

Đầu ra phải là một danh sách tất cả các kết hợp có thay thế với kích thước k từ tập đã cho. Bạn có thể in chúng và các yếu tố trong mỗi thứ tự theo bất kỳ thứ tự nào.

Bạn không thể sử dụng kết hợp tạo nội dung với thay thế. Nhưng bạn có thể sử dụng nội dung để tạo kết hợp thông thường, hoán vị, bộ dữ liệu, v.v.

Đây là mã golf, mã ngắn nhất thắng.

Thí dụ

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

Câu trả lời:


8

Thạch, 4 byte

Cảm ơn Sp3000 đã lưu 2 byte.

ṗṢ€Q

Đầu vào là nknhư là đối số dòng lệnh theo thứ tự đó. Sử dụng các yếu tố 1để n.

Hãy thử trực tuyến!

Giải trình

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

8

CJam (8 byte)

{m*:$_&}

Bản demo trực tuyến

Mổ xẻ

{    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

Toán học, 31 29 byte

Cảm ơn A Simmons đã lưu 2 byte.

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

Một hàm không tên lấy nklàm đối số nguyên theo thứ tự đó và trả về một danh sách các danh sách. Các yếu tố sẽ 1đến n. Hoạt động tương tự như câu trả lời của Peter Peter.


@ jimmy23013 Không phải ai tôi cũng biết.
Martin Ender

Tôi nghĩ bạn có thể lưu hai byte bằng{}∪Sort/@Range@#~Tuples~#2&
A Simmons

@ASimmons Ý tưởng hay, cảm ơn bạn!
Martin Ender

3

MATL , 11 byte

(Có một giải pháp 9 byte dựa trên sức mạnh của Cartesian, nhưng Peter Taylor đã làm điều đó . Hãy thử một cái gì đó khác biệt).

Sự kết hợp với sự thay thế có thể được giảm xuống thành sự kết hợp mà không cần thay thế như sau. Chúng tôi muốn n Cr k, ví dụ với n=3, k=2:

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

Chúng ta có thể tính toán n+k-1 C k:

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

và sau đó trừ đi 0 1 ... k-1từ mỗi hàng:

+q:2GXn2G:-

Giải trình:

+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

Mã này hoạt động trong phiên bản 13.1.0 của ngôn ngữ / trình biên dịch, sớm hơn so với thử thách.

Bạn có thể thử trực tuyến! Lưu ý rằng trình biên dịch trực tuyến đã được cập nhật để phát hành 14.0.0, vì vậy Xncần phải thay đổi thành XN.


3

JavaScript (Firefox 30-57), 71 byte

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

Tôi có thể sử dụng keys()một lần.


2

Ruby, 56 55 byte

Hai giải pháp, đáng ngạc nhiên là cả hai cùng chiều dài:

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

Này, bạn đã nói rằng chúng ta có thể sử dụng các nội dung hoán vị ...

Điều này chỉ đơn giản là tạo ra tất cả các hoán vị lặp đi lặp lại (cái thứ hai tạo ra các sản phẩm Cartesian lặp đi lặp lại) và loại bỏ những sản phẩm không theo thứ tự được sắp xếp.

Cảm ơn Martin vì đã lưu một byte với 0...n-> 1..n!


1

Bình thường, 7 byte

{SM^UQE

Sử dụng thuật toán tương tự như câu trả lời của Peter.

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

1

Python, 63 byte

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

Một phương pháp đệ quy. Để thực hiện một MultiSet của kcác yếu tố, 1đến n, chúng ta chọn:

  • Bao gồm một thể hiện khác nvà vẫn còn để tạo ra nhiều k-1phần tử từ 1đếnn
  • Không bao gồm một thể hiện khác nvà vẫn còn để tạo nhiều kphần tử từ 1đếnn-1

Chúng tôi chấm dứt khi một trong hai khoặc nđạt được 0, và nếu nó kđạt được 0, chúng tôi đưa ra một trường hợp cơ bản của danh sách trống. Nếu không, chúng ta có số phần tử sai, và do đó đưa ra danh sách trống.


1

Trăn 3, 81 80

Giải pháp đệ quy:

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

Hàm t(n, k, b)trả về danh sách các ktập hợp con đa tầng của phạm vi từ bđến n. Danh sách này là trống nếu k <= 0. Mặt khác, chúng tôi phá vỡ vấn đề dựa trên phần tử nhỏ nhất của tập hợp con mà chúng tôi biểu thị bằng i.

Đối với mỗi itrong phạm vi từ bđến n, chúng tôi tạo ra tất cả các ktập hợp -multi với phần tử nhỏ nhất ibằng cách bắt đầu [i]và sau đó nối thêm từng (k-1)tập hợp con của phạm vi từ iđến n, mà chúng tôi có được bằng cách gọi đệ quy t(n, k-1, i).


Chào mừng bạn đến với Câu đố lập trình & Code Golf! Đây là một câu trả lời đầu tiên tốt đẹp. Bạn có thể cung cấp một lời giải thích về cách làm việc của mã?
Alex A.

Trông thật tuyệt. Giải pháp tốt đẹp!
Alex A.

1

APL Dyalog , 22 byte

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

Yêu cầu ⎕IO←0, được mặc định trong nhiều hệ thống APL. Lấy k làm đối số trái, n là đối số phải.

⍳⍺*⍵0 1 2 ... kⁿ
⍺⊥⍣¯1chuyển đổi sang cơ sở k
chuyển đổi
ma trận thành danh sách các danh sách
{⍵[⍋⍵]}¨sắp xếp mỗi ...
duy nhất


1

J, 18 byte

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

Cách tiếp cận tương tự được sử dụng trong @ Adám's giải pháp .

Một cách tiếp cận khác sử dụng sản phẩm của Cartesian {cho 24 byte. Tham gia kvào LHS vàn trên RHS.

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

Sử dụng

   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│
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘

Giải trình

[:~.#~<@/:~@#: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

Clojure, 94 byte

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

Lưu ý thứ tự tham số đã thay đổi: thứ 1 kvà thứ 2 là n. Điều này đã lưu 1 byte trong (f(dec k)n).


0

Toán học, 36 byte

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

Vui lòng cho tôi biết có phần thưởng 1/6 cho việc không sử dụng [] s ... Hoặc có thể cho nhiều lần sử dụng ##?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.