Daftar semua kombinasi dengan penggantian (atau kombinasi dengan pengulangan) ukuran k dari seperangkat elemen n .
Kombinasi dengan penggantian adalah multiset unordered bahwa setiap elemen di dalamnya juga di set dari n elemen. Perhatikan bahwa:
- Itu tidak teratur. Jadi set yang sebelumnya dicetak dengan urutan yang berbeda tidak boleh dicetak lagi.
- Ini adalah multiset. Elemen yang sama dapat (tetapi tidak diharuskan) muncul lebih dari sekali. Ini adalah satu-satunya perbedaan antara kombinasi dengan penggantian dan kombinasi normal.
- Set harus memiliki elemen k yang tepat .
Atau, itu juga merupakan subset size- k dari multiset yang berisi masing-masing n elemen k kali.
Input harus berupa n dan k , di mana elemen-elemennya adalah bilangan bulat pertama n positif atau non-negatif, atau elemen n dan k , di mana Anda dapat mengasumsikan elemen n semuanya berbeda satu sama lain.
Output harus berupa daftar semua kombinasi dengan penggantian dengan ukuran k dari set yang diberikan. Anda dapat mencetaknya dan elemen-elemen di dalamnya masing-masing dalam urutan apa pun.
Anda tidak boleh menggunakan builtin menghasilkan kombinasi dengan penggantian. Tetapi Anda dapat menggunakan builtin untuk menghasilkan kombinasi normal, permutasi, tupel, dll.
Ini golf kode, kode terpendek yang menang.
Contoh
Input: 4 2
Output: [0 0] [0 1] [0 2] [0 3] [1 1] [1 2] [1 3] [2 2] [2 3] [3 3]
sumber
{}∪Sort/@Range@#~Tuples~#2&
MATL , 11 byte
(Ada solusi 9-byte berdasarkan kekuatan Cartesian, tetapi Peter Taylor sudah melakukannya . Mari kita coba sesuatu yang berbeda).
Kombinasi dengan penggantian dapat dikurangi menjadi kombinasi tanpa penggantian sebagai berikut. Kami ingin
n Cr k
, misalnya dengann=3
,k=2
:Kami dapat menghitung
n+k-1 C k
:lalu kurangi
0 1 ... k-1
dari setiap baris:Penjelasan:
Kode ini berfungsi di rilis 13.1.0 dari bahasa / kompiler, yang lebih awal dari tantangan.
Anda dapat mencobanya secara online! Perhatikan bahwa kompiler online telah diperbarui untuk merilis 14.0.0, jadi
Xn
perlu diubah keXN
.sumber
JavaScript (Firefox 30-57), 71 byte
Saya bisa menggunakannya
keys()
sekali.sumber
Ruby,
5655 byteDua solusi, secara mengejutkan keduanya memiliki panjang yang sama:
Hei, kau tidak mengatakan kita bisa menggunakan builtin permutasi ...
Ini hanya menghasilkan semua permutasi berulang (yang kedua menghasilkan produk Cartesian berulang) dan menghilangkan yang tidak dalam urutan.
Terima kasih kepada Martin karena telah menyimpan byte dengan
0...n
->1..n
!sumber
Pyth, 7 byte
Menggunakan algoritma yang sama dengan jawaban Peter.
sumber
Python, 63 byte
Metode rekursif. Untuk membuat multiset dari
k
unsur-unsur,1
untukn
, kami memilih untuk:n
, dan masih membuat multisetk-1
elemen dari1
hinggan
n
, dan itu tetap membuat multisetk
elemen dari ke1
ken-1
Kami mengakhiri ketika salah satu
k
ataun
mencapai0
, dan jikak
mencapai0
, kami memberikan kasus dasar dari daftar kosong. Jika tidak, kami memiliki jumlah elemen yang salah, dan berikan daftar kosong.sumber
Python 3,
8180Solusi rekursif:
Fungsi
t(n, k, b)
mengembalikan daftark
subset semua elemen multi-rentang darib
ken
. Daftar ini kosong jikak <= 0
. Jika tidak, kami memecahkan masalah berdasarkan elemen terkecil dari multi-subset, yang kami tunjukkani
.Untuk masing-masing
i
dalam rentang darib
hinggan
, kami membuat semuak
subset -multi dengan elemen terkecili
dengan mulai dengan[i]
dan kemudian menambahkan setiap(k-1)
subset -multi dari rentang darii
ken
, yang kami peroleh dengan menelepon secara rekursift(n, k-1, i)
.sumber
Dyalog APL , 22 byte
Membutuhkan
⎕IO←0
, yang merupakan standar dalam banyak sistem APL. Membawa k sebagai argumen kiri, n sebagai argumen kanan.⍳⍺*⍵
0 1 2 ... kⁿ⍺⊥⍣¯1
konversikan ke basis k⍉
transpos↓
buat matriks ke daftar daftar,{⍵[⍋⍵]}¨
masing-masing ...∪
uniksumber
J, 18 byte
Pendekatan serupa digunakan dalam solusi @ Adám .
Pendekatan lain menggunakan produk Cartesian
{
selama 24 byte. Mengambilk
pada LHS dann
pada RHS.Pemakaian
Penjelasan
sumber
Clojure, 94 byte
Perhatikan urutan parameter yang diubah: 1 adalah
k
dan 2 adalahn
. Ini menyimpan 1 byte dalam(f(dec k)n)
.sumber
Mathematica, 36 byte
Tolong beritahu saya ada bonus 1/6 untuk tidak menggunakan [] s ... Atau mungkin untuk banyak penggunaan ##?
sumber