Listen Sie alle Kombinationen mit Ersetzung (oder Kombinationen mit Wiederholung) der Größe k aus einer Menge von n Elementen auf.
Eine Kombination mit Ersetzung ist ein ungeordnetes Multiset, bei dem sich jedes Element auch in der Menge von n Elementen befindet. Beachten Sie, dass:
- Es ist ungeordnet. Ein zuvor gedrucktes Set mit einer anderen Reihenfolge sollte daher nicht erneut gedruckt werden.
- Es ist ein Multiset. Das gleiche Element kann (muss aber nicht) mehrmals vorkommen. Dies ist der einzige Unterschied zwischen einer Kombination mit Ersatz und einer normalen Kombination.
- Die Menge sollte genau k Elemente haben.
Alternativ ist es auch eine Teilmenge der Größe k des Multisets, die jedes der n Elemente k- mal enthält.
Die Eingabe sollte entweder n und k sein , wobei die Elemente die ersten n positiven oder nicht negativen ganzen Zahlen sind, oder die n Elemente und k , wobei Sie annehmen können, dass sich die n Elemente alle voneinander unterscheiden.
Die Ausgabe sollte eine Liste aller Kombinationen mit Ersetzung durch Größe k aus dem angegebenen Satz sein. Sie können sie und die Elemente in jeder von ihnen in beliebiger Reihenfolge drucken.
Sie dürfen keine eingebauten Kombinationen mit Ersatz verwenden. Sie können jedoch integrierte Funktionen verwenden, um normale Kombinationen, Permutationen, Tupel usw. zu generieren.
Dies ist Code-Golf, kürzester Code gewinnt.
Beispiel
Input: 4 2
Output: [0 0] [0 1] [0 2] [0 3] [1 1] [1 2] [1 3] [2 2] [2 3] [3 3]
quelle
{}∪Sort/@Range@#~Tuples~#2&
MATL , 11 Bytes
(Es gibt eine 9-Byte-Lösung, die auf kartesischer Leistung basiert, aber Peter Taylor hat das bereits getan . Versuchen wir etwas anderes.)
Kombinationen mit Ersatz können wie folgt auf Kombinationen ohne Ersatz reduziert werden. Wir wollen
n Cr k
zum Beispiel mitn=3
,k=2
:Wir können berechnen
n+k-1 C k
:und dann
0 1 ... k-1
von jeder Zeile subtrahieren :Erläuterung:
Der Code funktioniert in Version 13.1.0 der Sprache / des Compilers, die früher als die Herausforderung ist.
Sie können es online versuchen! Beachten Sie, dass der Online-Compiler auf Version 14.0.0 aktualisiert wurde und daher
Xn
in geändert werden mussXN
.quelle
JavaScript (Firefox 30-57), 71 Byte
Ich darf es
keys()
einmal benutzen .quelle
Ruby,
5655 BytesZwei Lösungen, überraschenderweise beide gleich lang:
Hey, du hast gesagt, wir könnten eingebaute Permutationen verwenden ...
Dies erzeugt einfach alle wiederholten Permutationen (die zweite erzeugt wiederholte kartesische Produkte) und entfernt diejenigen, die nicht in sortierter Reihenfolge sind.
Vielen Dank an Martin für das Speichern eines Bytes mit
0...n
->1..n
!quelle
Pyth, 7 Bytes
Verwendet den gleichen Algorithmus wie Peters Antwort.
quelle
Python, 63 Bytes
Eine rekursive Methode. Um eine Vielzahl von
k
Elementen1
zu erstellenn
, wählen wir entweder:n
, und es bleibt eine Vielzahl vonk-1
Elementen von1
bis zu erstellenn
n
, und es bleibt eine Vielzahl vonk
Elementen von bis1
zun-1
Wir beenden, wenn entweder
k
odern
erreicht0
, und wenn esk
erreicht ist0
, geben wir einen Basisfall der leeren Liste an. Wenn nicht, haben wir die falsche Anzahl von Elementen und geben daher die leere Liste an.quelle
Python 3,
8180Rekursive Lösung:
Die Funktion
t(n, k, b)
gibt die Liste allerk
Multi-Teilmengen aller Elemente des Bereichs vonb
bis zurückn
. Diese Liste ist leer, wennk <= 0
. Andernfalls teilen wir das Problem anhand des kleinsten Elements der Multi-Teilmenge auf, das wir mit bezeichneni
.Für jede
i
im Bereich vonb
bisn
generieren wir allek
-multi-Teilmengen mit dem kleinsten Element,i
indem wir mit[i]
jeder(k-1)
-multi-Teilmenge des Bereichs voni
bis beginnen und diese dann anhängenn
, die wir durch rekursives Aufrufen erhaltent(n, k-1, i)
.quelle
Dyalog APL , 22 Bytes
Erforderlich
⎕IO←0
, was in vielen APL-Systemen Standard ist. Nimmt k als linkes Argument, n als rechtes Argument.⍳⍺*⍵
0 1 2 ... kⁿ⍺⊥⍣¯1
in Basis konvertieren k⍉
transponieren↓
machen Matrix in Liste von Listen{⍵[⍋⍵]}¨
sortieren jeweils ...∪
das Einzigartigequelle
J, 18 Bytes
Ein ähnlicher Ansatz wird in der Lösung von @ Adám verwendet .
Ein anderer Ansatz, bei dem ein kartesisches Produkt
{
für 24 Bytes verwendet wird. Übernimmtk
die LHS undn
die RHS.Verwendungszweck
Erläuterung
quelle
Clojure, 94 Bytes
Beachten Sie die geänderte Parameterreihenfolge: 1. ist
k
und 2. istn
. Dies sparte 1 Byte in(f(dec k)n)
.quelle
Mathematica, 36 Bytes
Bitte sag mir, dass es einen 1/6 Bonus für die Verwendung von no [] s gibt ... Oder vielleicht für die vielen Verwendungen von ##?
quelle