Das Problem des Münzwechsels ist sehr gut dokumentiert. In Anbetracht einer unendlichen Vorrat an Münzen von Konfessionen x_1
zu x_m
müssen Sie die Anzahl von Kombinationen zu finden , die summieren sich zu y
. Zum Beispiel gegeben x = {1,2,3}
und y = 4
wir haben vier Kombinationen:
{1,1,1,1}
{1,1,2}
{1,3}
{2,2}
Einführung
Es gibt verschiedene Varianten des Münzwechselproblems. In dieser Variante gibt es zwei zusätzliche Einschränkungen:
- Jede Stückelung muss mindestens einmal verwendet werden.
- Insgesamt muss genau eine feste Anzahl von Münzen verwendet werden.
Zum Beispiel gegeben x = {1,2,3}
, y = 36
und n = 15
wo n
die Gesamtzahl der Münzen ist , die verwendet werden müssen, erhalten wir vier Kombinationen:
{1,2,2,2,2,2,2,2,3,3,3,3,3,3,3}
(1 Einsen, 7 Zweien, 7 Dreien){1,1,2,2,2,2,2,3,3,3,3,3,3,3,3}
(2 Einsen, 5 Zweien, 8 Dreien){1,1,1,2,2,2,3,3,3,3,3,3,3,3,3}
(3 Einsen, 3 Zweien, 9 Dreien){1,1,1,1,2,3,3,3,3,3,3,3,3,3,3}
(4 Einsen, 1 Zweien, 10 Dreien)
Herausforderung
Die Herausforderung besteht darin, eine Funktion enumerate
in der Sprache Ihrer Wahl zu schreiben, die alle oben beschriebenen Kombinationen auflistet:
- Die Liste der Stückelungen. Zum Beispiel
{1,5,10,25}
. Sie können entweder Listen oder Arrays verwenden. - Eine nicht negative Ganzzahl
y
, die die Summe aller Kombinationen angibt. - Eine nicht negative Ganzzahl
n
, die die Gesamtzahl der Münzen angibt.
Die Reihenfolge der Argumente spielt keine Rolle. Punktfreie Funktionen sind erlaubt.
Die Ausgabe der enumerate
Funktion muss eine Liste von Kombinationen sein. Jede Kombination muss eindeutig sein und eine Liste von n
ganzen Zahlen enthalten, die sich addieren y
. Jede Stückelung muss in jeder Kombination mindestens einmal vorkommen und es darf keine Kombination fehlen. Die Reihenfolge der ganzen Zahlen und der Kombinationen spielt keine Rolle. Sie können entweder Listen oder Arrays für die Ausgabe verwenden.
Beachten Sie die folgenden Randfälle:
- Wenn beide
y
undn
Null sind und die Liste der Nennwerte leer ist, ist die Ausgabe eine Liste mit einer Kombination, der leeren Kombination (dh{{}}
). - Wenn andernfalls
y
Nulln
ist, Null ist oder die Liste der Nennwerte leer ist, ist die Ausgabe eine Liste von Nullkombinationen (dh{}
). - Im Allgemeinen
y
istn
die Ausgabe eine Liste von Nullkombinationen , wenn sie kleiner als die Summe der Nennwerte oder kleiner als die Anzahl der Nennwerte ist.
Die Bewertung basiert auf der Größe des gesamten Programms in Byte. Beachten Sie, dass dies die enumerate
Funktion, Hilfsfunktionen, Importanweisungen usw. umfasst. Testfälle sind nicht enthalten.
quelle
y
kleiner als die Summe der Nennwerte ist, erreichen Sie irgendwann in Ihrer rekursiven Lösung den Basisfall, in dem die Liste der Nennwerte leer ist. Daher lautet die Antwort{}
(dh es wurde keine Lösung gefunden). Wennn
weniger als die Anzahl der Nennwerte, dann werden Sie schließlich den Basisfall erreichen, won = 0
abery != 0
. Daher wird die Antwort erneut lauten{}
.Antworten:
05AB1E, 20 Bytes
Die Eingabe erfolgt in der Reihenfolge:
list of values
,nr of coins
,sum to reach
.Erklärung kurz
final length - length of unique coin list
Probieren Sie es online aus
Der Online-Compiler kann keine große Anzahl von Münzen verarbeiten.
quelle
MATL , 22 Bytes
Die Eingabereihenfolge ist: Reihe von Nennwerten, Anzahl der entnommenen Münzen (
n
), gewünschte Summe (y
).Jede Kombination wird in einer anderen Zeile angezeigt. Leere Ausgabe wird als leere Zeichenfolge angezeigt (also nichts).
Probieren Sie es online!
Dem Code im Online-Compiler für das Beispiel in der Challenge fehlt der Speicher, aber er funktioniert offline mit einem Standardcomputer, der recht modern ist:
Erläuterung
quelle
Python 3,
120106 BytesEine anonyme Funktion, die die Eingabe eines Tupels von Nennwerten des Formulars
(x_1, x_2, x_3 ... , x_k)
, eines Zielwerts und einer Anzahl von Münzen über ein Argument akzeptiert und eine Liste von Tupeln des Formulars zurückgibt[(solution_1), (solution_2), (solution_3), ... (solution_k)]
.Wie es funktioniert
Itertools
Diecombinations_with_replacement
Funktion von wird verwendet, um allel-len(d)
Kombinationen mit Ersetzung der Nennwerte zu generieren . Durch das Anhängend
an jede dieser Kombinationen wird garantiert, dass jeder Nennwert mindestens einmal vorkommt und dass die neue Kombination eine Länge hatl
. Wenn sich die Elemente einer Kombination zu summieren,t
wird die Kombination als Tupel zur Rückgabeliste hinzugefügt.Probieren Sie es auf Ideone
Eine alternative Methode für 108 Bytes
Eine anonyme Funktion, die die Eingabe eines Tupels von Nennwerten des Formulars
(x_1, x_2, x_3 ... , x_k)
, eines Zielwerts und einer Anzahl von Münzen über ein Argument akzeptiert und eine Reihe von Tupeln des Formulars zurückgibt{(solution_1), (solution_2), (solution_3), ... (solution_k)}
.Wie es funktioniert (andere Version)
Hierbei wird die
product
Funktion from verwendetitertools
, um allel-len(d)
Anordnungen der Nennwerte zu generieren . Durch das Anhängend
an jede dieser Kombinationen wird garantiert, dass jeder Nennwert mindestens einmal vorkommt und dass die neue Kombination eine Länge hatl
. Wenn sich die Elemente einer Kombination zu summieren,t
wird die Kombination sortiert, von einer Liste in ein Tupel konvertiert und zu den Rückgabetupeln hinzugefügt. Schließlichset
entfernt das Aufrufen alle Duplikate.Probieren Sie es auf Ideone (andere Version)
quelle
JavaScript (ES6), 135 Byte
quelle