Değiştirme ile kombinasyonlar oluşturun


10

Bir n öğeden k boyutundaki değiştirme (veya tekrarlanan kombinasyonlar) ile tüm kombinasyonları listeleyin .

Değiştirme ile kombinasyon, içindeki her öğenin de n öğesi kümesinde yer aldığı sıralanmamış bir çoklu kümedir . Bunu not et:

  • Sırasız. Bu nedenle daha önce farklı bir siparişe sahip basılı bir set tekrar basılmamalıdır.
  • Bu bir çoklu ayardır. Aynı öğe bir kereden fazla görünebilir (ancak zorunlu değildir). Değiştirme ile bir kombinasyon ile normal bir kombinasyon arasındaki tek fark budur.
  • Setin tam olarak k elemanları olmalıdır .

Alternatif olarak, n öğesinin her birini k kez içeren multiset'in boyut- k altkümesidir .

Giriş olmalıdır ya n ve k elemanlar ilk sırada, n pozitif veya negatif olmayan tamsayılar veya n unsurlar ve k sen varsayabiliriz, n elemanlarını birbirinden farklıdır.

Çıktı , verilen setten k boyutu ile değiştirilen tüm kombinasyonların bir listesi olmalıdır . Bunları ve her birindeki öğeleri istediğiniz sırayla yazdırabilirsiniz.

Yer değiştiren kombinasyonlar oluşturan yerleşik yapıları kullanamazsınız. Ancak normal kombinasyonları, permütasyonları, tuplleri vb. Oluşturmak için yerleşikleri kullanabilirsiniz.

Bu kod golf, en kısa kod kazanır.

Misal

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

Yanıtlar:


8

Jöle, 4 bayt

2 bayt tasarruf için Sp3000'e teşekkürler.

ṗṢ€Q

Girdi olduğunu nve kbu sırayla komut satırı bağımsız değişkenleri olarak. Unsurları kullanır 1için n.

Çevrimiçi deneyin!

açıklama

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

8

CJam (8 bayt)

{m*:$_&}

Çevrimiçi demo

teşrih

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

A Simmons'a 2 bayt kaydettiği için teşekkürler.

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

İsmi açıklanmayan fonksiyon alma nve kbu sırayla ve listelerin bir listesini dönen tamsayı argüman olarak. Elementler olacak 1kadar n. Peter'ın CJam cevabı ile aynı şekilde çalışır.


@ jimmy23013 Fark ettiğim biri değil.
Martin Ender

Sanırım iki bayt tasarruf edebilirsiniz{}∪Sort/@Range@#~Tuples~#2&
A Simmons

@ASimmons Güzel fikir, teşekkür ederim!
Martin Ender

3

MATL , 11 bayt

( Kartezyen gücüne dayanan 9 baytlık bir çözüm var , ama Peter Taylor bunu zaten yaptı . Farklı bir şey deneyelim).

Değiştirme ile kombinasyonlar aşağıdaki gibi değiştirme olmadan kombinasyonlara indirgenebilir. Biz istiyoruz n Cr kile örneğin n=3, k=2:

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

Hesaplayabiliriz n+k-1 C k:

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

ve ardından 0 1 ... k-1her satırdan çıkartın:

+q:2GXn2G:-

Açıklama:

+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

Kod , dilden daha önceki dil / derleyicinin 13.1.0 sürümünde çalışır .

Şunları yapabilirsiniz çevrimiçi deneyin! Çevrimiçi derleyicinin 14.0.0 yayınlanacak şekilde güncellendiğini, bu nedenle Xnolarak değiştirilmesi gerektiğini unutmayın XN.


3

JavaScript (Firefox 30-57), 71 bayt

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

Bir keys()kez kullanıyorum.


2

Yakut, 56 55 bayt

Şaşırtıcı derecede aynı uzunlukta iki çözüm:

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

Hey, did biz permütasyon yerleşiklerini kullanabileceğini söylüyorlar ...

Bu, tüm tekrarlanan permütasyonları (ikincisi tekrarlanan Kartezyen ürünleri üretir) oluşturur ve sıralı olmayanları kaldırır.

Martin'e bir bayt kaydettiği için teşekkürler 0...n-> 1..n!


1

Pyth, 7 bayt

{SM^UQE

Peter'ın cevabı ile aynı algoritmayı kullanır.

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

1

Python, 63 bayt

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

Özyinelemeli bir yöntem. Bir MultiSet yapmak için kelemanlar, 1için n, biz iki seçenekten birini tercih:

  • Başka bir örneğini ekleyin nve bir MultiSet yapmaya devam k-1den elemanları 1içinn
  • Do başka bir örneğini içermez nve bu bir MultiSet yapmaya devam kila elemanları 1içinn-1

Biz sonlandırmak zaman ya kya nulaşır 0ve eğer kulaştı 0, biz boş listenin bir taban çantayı ver. Değilse, yanlış sayıda öğeye sahibiz ve bu nedenle boş listeyi verin.


1

Python 3, 81 80

Özyinelemeli çözüm:

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

Fonksiyonu t(n, k, b)tüm listesini verir kgelen aralığın -eleman çoklu alt kümeleri biçin n. Bu liste boşsa k <= 0. Aksi takdirde, sorunu belirttiğimiz çoklu alt kümenin en küçük öğesine dayanarak sorunu çözeriz i.

Her biri için iaralığında biçin n, biz her oluşturmak kküçük elemanı ile -çok alt grupları iile başlanarak [i], her ekleme ve sonra (k-1)gelen aralığın -çok alt kümesi iiçin n, biz ardışık arayarak elde olan t(n, k-1, i).


Programlama Bulmacaları ve Kod Golf hoş geldiniz! Bu güzel bir ilk cevap. Kodun nasıl çalıştığına dair bir açıklama verebilir misiniz?
Alex

Harika görünüyor. Güzel çözüm!
Alex

1

Dyalog APL , 22 bayt

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

⎕IO←0Birçok APL sisteminde varsayılan olan gerektirir . K'yi sol argüman, n'yi sağ argüman olarak alır.

⍳⍺*⍵0 1 2 ... kⁿ
⍺⊥⍣¯1baz k dönüştürmek
transpoze
yapmak matris liste listesine
{⍵[⍋⍵]}¨sıralamak her ...
benzersiz


1

J, 18 bayt

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

@ Adám'ın çözümünde de benzer yaklaşım kullanılmıştır .

{24 bayt için Kartezyen ürün kullanan başka bir yaklaşım . Alır klhs ve nrhs.

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

kullanım

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

açıklama

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

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

Değişmiş parametre sırasını Not: 1 olduğu kve 2 olduğunu n. Bu 1 bayt kaydedildi (f(dec k)n).


0

Mathematica, 36 bayt

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

Lütfen bana [] kullanmaman için 1/6 bonus olduğunu söyle ... Ya da belki ## 'in birçok kullanımı için?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.