Ich bin ein junger Zauberer und ich bemühe mich sehr, während meiner magischen Begegnungen kein Mana zu verschwenden.
Ich habe zu jeder Zeit X Zaubersprüche zur Verfügung und jeder von ihnen hat seine eigenen Manakosten Y.
X, wobei Y positive ganze Zahlen sind, die streng unter 11 liegen.
Als Anfänger schwankt mein Manavorrat stark (er ist immer niedriger als 11). und ich brauche Hilfe, um so wenig Zauber wie möglich zu wirken (Schriftrollen sind teuer, weißt du), während ich meinen Manavorrat entleere. Wenn Sie keine Zauberkombination finden, die genau der Größe meines Manavorrats entspricht, bieten Sie mir die nächstgelegene (und billigere) an.
Ich bin zu dir und deiner unendlichen Weisheit gekommen, um mir zu helfen, der größte dunkle Zauberer zu werden. Ich werde nicht enttäuscht sein.
INPUT-Stil (weil Stil alles ist):
Y; abcdef
Y ist die Größe des Manavorrats. (a, b, c, d, e, f) sind die Zauber. Es gibt 6 Zaubersprüche, der erste kostet 'a' Mana, der zweite Zauberspruch 'b' Mana usw.
EINGABE: 4; 1 2 3 3 7 6
Ich habe 4 Manas und 6 Zauber zur Verfügung. Zwei Zauber kosten 1 Mana, 1 Zauber kostet 2 Mana, zwei Zauber kosten 3 Mana usw.
AUSGABE: (3,1)
EINGANG: 3; 1 3 5 2 10
AUSGANG: (3)
EINGANG: 8; 4 1 9
AUSGABE: (4,1)
EINGABE: 4; 1 2 2 3
AUSGABE: (2,2), (1,3)
Sie müssen jede Kombination von Zaubersprüchen ausgeben, es ist jedoch nicht erforderlich, Zaubersprüche zu unterscheiden, die die gleichen Kosten verursachen.
Die kürzeste Beschwörung für jede Maschine, die Sie sich wünschen, wird eine Fülle von Dank und eine Peitsche des Schicksals gewährt.
Antworten:
GolfScript, 55 Zeichen
Probieren Sie es online aus .
quelle
APL (87)
Das Eingabeformat ist eine APL-Liste, wobei das erste Element der Manavorrat und der Rest der Elemente die Zauber sind. Die Ausgabe enthält jede mögliche Kombination von Zaubersprüchen in einer separaten Zeile.
Erläuterung:
k←1↓i←⎕
: Lesen Sie eine Liste aus der Eingabe und speichern Sie sie ini
. Lass das erste Element (Mana) fallen und speichere den Rest ink
.1↓g←⍳⍴k
: Generieren Sie eine Liste1
bis zur Länge vonk
und speichern Sie sie ing
. Lass das erste Element fallen und gib[2..len k]
.{
...}¨
: Für jede dieser Angaben erhalten Sie die Indizes jeder einzelnen Kombination ink
der Länge⍵
:z←,⍳⍵/⍴k
: Holen Sie sich eine⍵
eindimensionale Matrix von Längenindizesk
, glätten Sie sie und speichern Sie sie inz
.∧/¨2>/¨
: Überprüfen Sie für jede Koordinate in jedem Index, ob alle Koordinaten für dieN
dritte Dimension höher sind als die für dieN-1
dritte Dimension.z/⍨
: Wählen Sie ausz
den Elementen aus, für die das oben Gesagte gilt⊃,/g,
: Da das oben Gesagte für eindimensionale Vektoren nicht funktioniert, fügen Sieg
die Vorderseite hinzu. Wir haben jetzt eine Liste von Listen von Listen (wegen der foreach) aller eindeutigen Indizes ink
. Verketten Sie die Listen miteinander und schließen Sie sie ein (so erhalten Sie eine Liste mit Listen).{
...}¨
: Suchen Sie für jede mögliche Koordinatenliste nach der entsprechenden Wertekombinationk
und filtern Sie die zu teuren heraus:a←k[⍵]
: Suchen Sie die aktuelle Kombination ink
und speichern Sie sie ina
.a/⍨⊃i≥+/a
:a
Nur auswählen , wenn der erste Gegenstand ini
(der Manavorrat) gleich oder größer als die Summe der Elemente von ista
.m←
: speichere alle Kombinationen von Zaubersprüchen, die das Mana-Limit nicht überschreiten, inm
.m←m/⍨t=⌈/t←+/¨m
: Wählen Siem
nur die Kombinationen aus, deren Summe der Summe der teuersten Kombination entspricht, und speichern Sie siem
erneut.m/⍨t=⌊/t←⊃∘⍴¨m
: Wählen Siem
nur die Kombinationen aus, deren Länge der Länge der kürzesten Kombination entspricht.↑∪
: Entfernen Sie alle Duplikate und konvertieren Sie sie in eine Matrix (um jede Kombination in einer separaten Zeile anzuzeigen).quelle
Rubin,
114113 ZeichenEingabe: Ein Array aus zwei Elementen des Assistentenmanas und der Zauberliste, formatiert mit einem einzeiligen JSON.
Ausgabe: Ein 2D-Array der Zauberlisten, das als einzeiliger JSON formatiert ist oder
nil
wenn der Assistent keinen Zauber wirken kann.Ich liebe besonders
x,y = eval gets
. So gefährlich und böse, aber so mächtig und einfach. Perfekt zum Golfen.Beides
sort
unduniq
sind notwendig. Andernfalls werden Duplikate für Eingaben wie erzeugt[4, [1, 3, 1]]
. Ich bin nicht glücklich darüber.find
ist eine nützliche Methode zur Steuerung des Flusses. Der Rückgabewert ist hier jedoch nicht so nützlich. In Bezug auf die Länge entspricht diesany?
dem Rückgabewert, der noch weniger nützlich ist.Beispiele:
quelle
map
anstelle von verwendenfind
? Auch.reduce(:+)
nicht&
erforderlichmap
hört nicht beim ersten positiven Ergebnis auf. Es würde alle Möglichkeiten drucken, gruppiert nach Manakosten und Größe. Danke für den zweiten Rat.Haskell (GHC),
172 167143 ZeichenDeobfuscated:
[4,1,2,3,3,7,6]
. B. ).Einfache Lösung: Nehmen Sie das Powerset des Eingangs und reduzieren Sie es, indem Sie nach Kombinationen filtern, für die wir genügend Mana haben usw.
quelle
Mathematica 131
Es muss kürzere Wege geben, aber das konnte ich mir einfallen lassen.
quelle