Erste Frage hier, schrei mich nicht an, wenn dies ein Duplikat oder eine schlechte Herausforderung ist.
Einführung
Ich habe mir diese Herausforderung selbst überlegt und es scheint ein gutes Grundrätsel für Anfänger im Code-Golfen zu sein. Es könnte mir auch bei der Entscheidung helfen, welche Code-Golf-Sprache ich lernen möchte.
Herausforderung
Bei einem Array von ganzen Zahlen, die kleiner oder gleich sind n
, wird die minimale Anzahl von Zahlen aus dem Array ausgegeben oder zurückgegeben, die sich genau summieren n
.
Sie können wählen, ob Sie eine Funktion oder ein vollständiges Programm schreiben möchten.
Eingang
Sie können davon ausgehen, sicher 0 <= n < 2^31
.
Nehmen Sie ein Array oder eine Liste jeder Art ( vector
für C ++ oder Java LinkedList
sind zulässig) n
sowie einen optionalen Parameter length
, der die Länge des Arrays angibt.
Sie können die Eingabe auch als durch Leerzeichen getrennte Zeichenfolge verwenden, die n
durch ein Komma oder ein Leerzeichen voneinander getrennt ist:
1 5 7 3 7 3 6 3 2 6 3,10
1 5 7 3 7 3 6 3 2 6 3 10
wenn es einfacher ist.
Ausgabe
Ausgabe oder Rückgabe der Mindestanzahl von Zahlen aus dem Array, die sich genau summieren n
. Mit dem obigen Beispiel:
1 5 7 3 7 3 6 3 2 6 3,10
Ihr Programm sollte drucken:
2
weil die minimale Anzahl von Zahlen , die Summe bis zu 10
ist 2
( 7
und 3
).
Für den Fall, dass es keine Lösung gibt, drucken oder geben Sie entweder ein Negativ, 0
"Keine Lösung" (obwohl dies nicht sinnvoll wäre) ∞
(wie vorgeschlagen) oder einen anderen falschen Wert mit Ausnahme einer leeren Zeichenfolge zurück.
Beispiel für Ein- und Ausgabe
Eingang:
1 5 7 3 7 3 6 3 2 6 3,10
143 1623 1646 16336 1624 983 122,18102
5 6 9,12
Ausgabe:
2
3
-1
Wertung
Das ist Code-Golf, also gewinnt der kürzeste Code in Bytes.
Die Top-Antwort wird zu Weihnachten angenommen.
quelle
false
für Fälle ohne Lösungen ausgeben ?Antworten:
Pyth,
1211 BytesDies nimmt
n
als erste Eingabezeile und die Liste in der zweiten Zeile.Probieren Sie es hier aus .
quelle
Japt ,
302118 BytesEs stellte sich heraus, dass es eine viel effizientere Methode gab. ;)
Testen Sie es online! (Hinweis:
n-
wurden@X-Y}
aus Kompatibilitätsgründen in geändert )Die Eingabe erfolgt als durch Leerzeichen oder Kommas getrenntes Array, gefolgt von einer Zahl. Ausgaben
undefined
für Testfälle ohne Lösungen.Ich kann nicht glauben, dass ich nicht an diese Version gedacht habe, als ich das ursprünglich schrieb ...
Seitdem wurden einige Optimierungen vorgenommen, die sich hier als nützlich erweisen:
U
am Anfang des Programms kann in der Regel weggelassen werden.Ã
ist eine Abkürzung für}
.n
sortiert jetzt die Nummern standardmäßig richtig.Jedes dieser Elemente entfernt ein Byte für insgesamt 15:
Online testen!
quelle
Mathematica,
7365 BytesReine Funktion, kehrt zurück,
∞
wenn es keine Lösung gibt.quelle
Python 3, 128 Bytes
Das ist nicht so gut, wie ich es gerne hätte, aber ich werde später daran arbeiten.
quelle
Mathematica, 45 Bytes
quelle
CJam, 34 Bytes
Probieren Sie es online aus . Das Eingabeformat ist die Summe, gefolgt von der Werteliste, zB:
Beachten Sie, dass dies eine Ausnahme auslöst, wenn keine Lösung gefunden wird. Die Ausnahme geht an stderr, wenn CJam über die Befehlszeile ausgeführt wird und das richtige Ergebnis (
0
) weiterhin an stdout . Dies entspricht also dem Konsens, der unter Sollte es zulässig sein, dass Einreichungen mit einem Fehler beendet werden?Der Code sieht möglicherweise länger aus als erwartet. Der Hauptgrund ist, dass CJam keine eingebauten Funktionen zum Erzeugen von Kombinationen hat. Zumindest ist das meine Entschuldigung und ich halte mich daran.
Erläuterung:
quelle
JavaScript (ES6), 84 Byte
Erläuterung
Nimmt ein
Array
vonNumber
s und einNumber
als Argumente. Gibt eine Anzahl vonInfinity
wenn kein Ergebnis zurück. Es ist eine rekursive Funktion,n
die jedes Element einzeln vom Array subtrahiert und daraus entfernt, bisn == 0
.Prüfung
Dieser Test wird
m
aufInfinity
später anstatt als Standardargument festgelegt, damit er in Chrome funktioniert (anstatt nur in Firefox).Code-Snippet anzeigen
quelle
Haskell, 72 Bytes
Gibt zurück,
0
wenn es keine Lösung gibt.Anwendungsbeispiel:
10 # [1,5,7,3,7,3,6,3,2,6,3]
->2
.Finden Sie alle Unterlisten der Eingabeliste
l
, die eine Summe von habenn
. Nimm die Länge jeder dieser Unterlisten und sortiere sie. Hänge ein an0
und nimm das erste Element.Wenn eine Singleton - Liste für die Ausgabe erlaubt ist, zum Beispiel
[2]
, können wir 7 Bytes speichern:n#l=minimum[length x|x<-subsequences l,sum x==n]
. Falls keine Lösung gefunden wird, wird die leere Liste[]
zurückgegeben.quelle