Meine Zauber wirken!

8

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.

Fabinout
quelle
Ich glaube, ich verpasse den Punkt oder verstehe Ihre Beispiele einfach nicht: erstes Beispiel: Ich finde 7 Zaubersprüche - können Sie das klarstellen? Auch die letzte: Warum sollte nicht die richtige Ausgabe (4) sein? Es hat weniger Zaubersprüche als (2,2) und das Rätsel besagt "Ich brauche Hilfe, um so wenig Zaubersprüche wie möglich zu wirken". Bedeutet das auch, dass wir alle Lösungen ausgeben müssen, wenn es mehrere Lösungen mit der gleichen Anzahl von Zaubersprüchen gibt?
Howard
Offensichtlich habe ich meine Ein- und Ausgänge durcheinander gebracht, dies ist vermutlich behoben. Für die letzte Frage, Ja, müssen Sie jede Kombination ausgeben, die die gleiche Anzahl von Zaubersprüchen enthält. Vielen Dank.
Fabinout
Sind die Eingabe- / Ausgabeformate angegeben oder ist alles möglich? Es handelt sich um eine Zahl + ein Array von Zahlen => ein 2d-Array von Zahlen?
John Dvorak
Ich würde entgegenkommen, solange sowohl die Ausgabe als auch die Eingabe Ihrer Schriftrolle mit mehrdeutiger Sprache (brainfck) klar und lesbar sind.
Fabinout
oder können wir sogar eine Funktion mit zwei Argumenten anstelle eines ganzen Programms schreiben? Oder sogar ein Ausdruck?
John Dvorak

Antworten:

4

GolfScript, 55 Zeichen

[[]]\{{+}+1$%|}/.@{1$0+{+}*.@>!*100*\,-~}+:s%$0={\s=}+,

Probieren Sie es online aus .

> 4 [1 1 2 3 3 7 6]
[[1 3]]

> 3 [1 3 5 2 10]
[[3]]

> 8 [4 1 9]
[[4 1]]

> 4 [1 2 2 3]
[[2 2] [1 3]]
Howard
quelle
5

APL (87)

↑∪m/⍨t=⌊/t←⊃∘⍴¨m←m/⍨t=⌈/t←+/¨m←{a/⍨⊃i≥+/a←k[⍵]}¨⊃,/g,{z/⍨∧/¨2>/¨z←,⍳⍵/⍴k}¨1↓g←⍳⍴k←1↓i←⎕

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.

⎕:    4, 1 2 3 3 7 6
3 1
⎕:    3, 1 3 5 2 10
3
⎕:    8, 4 1 9
1 4
⎕:    4, 1 2 2 3
2 2
3 1

Erläuterung:

  • k←1↓i←⎕: Lesen Sie eine Liste aus der Eingabe und speichern Sie sie in i. Lass das erste Element (Mana) fallen und speichere den Rest in k.
  • 1↓g←⍳⍴k: Generieren Sie eine Liste 1bis zur Länge von kund speichern Sie sie in g. Lass das erste Element fallen und gib [2..len k].
  • {... : Für jede dieser Angaben erhalten Sie die Indizes jeder einzelnen Kombination in kder Länge :
    • z←,⍳⍵/⍴k: Holen Sie sich eine eindimensionale Matrix von Längenindizes k, glätten Sie sie und speichern Sie sie in z.
    • ∧/¨2>/¨: Überprüfen Sie für jede Koordinate in jedem Index, ob alle Koordinaten für die Ndritte Dimension höher sind als die für die N-1dritte Dimension.
    • z/⍨: Wählen Sie aus zden Elementen aus, für die das oben Gesagte gilt
  • ⊃,/g,: Da das oben Gesagte für eindimensionale Vektoren nicht funktioniert, fügen Sie gdie Vorderseite hinzu. Wir haben jetzt eine Liste von Listen von Listen (wegen der foreach) aller eindeutigen Indizes in k. 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 Wertekombination kund filtern Sie die zu teuren heraus:
    • a←k[⍵]: Suchen Sie die aktuelle Kombination in kund speichern Sie sie in a.
    • a/⍨⊃i≥+/a: aNur auswählen , wenn der erste Gegenstand in i(der Manavorrat) gleich oder größer als die Summe der Elemente von ist a.
  • m←: speichere alle Kombinationen von Zaubersprüchen, die das Mana-Limit nicht überschreiten, in m.
  • m←m/⍨t=⌈/t←+/¨m: Wählen Sie mnur die Kombinationen aus, deren Summe der Summe der teuersten Kombination entspricht, und speichern Sie sie merneut.
  • m/⍨t=⌊/t←⊃∘⍴¨m: Wählen Sie mnur 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).
Marinus
quelle
1
Das ist arkan! Perfekt für einen Zauberer ...
Mark Thomas
5

Rubin, 114 113 Zeichen

x,y=eval gets
(d=0..10).find{|r|d.find{|c|s=y.sort.combination(c).select{|s|s.reduce(:+)==x-r}.uniq
p s if s[0]}}

Eingabe: 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 nilwenn 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 sortund uniqsind notwendig. Andernfalls werden Duplikate für Eingaben wie erzeugt [4, [1, 3, 1]]. Ich bin nicht glücklich darüber.

findist 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 dies any?dem Rückgabewert, der noch weniger nützlich ist.

Beispiele:

> [4, [1, 2, 3, 3, 7, 6]]
# [[1, 3]]
> [3, [1, 3, 5, 2, 10]]
# [[3]]
> [8, [4, 1, 9]]
# [[1, 4]]
> [4, [1, 2, 2, 3]]
# [[1, 3], [2, 2]]
> [4, [5, 6, 7]]
# nil
John Dvorak
quelle
Könnten Sie nicht mapanstelle von verwenden find? Auch .reduce(:+)nicht &erforderlich
Türknauf
maphö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.
John Dvorak
1

Haskell (GHC), 172 167 143 Zeichen

import Data.List
import GHC.Exts
f(x:y)=head.groupWith length.last.groupWith sum.filter((<=x).sum).nub$subsequences y
main=interact$show.f.read

Deobfuscated:

import Data.List
import GHC.Exts

f (x:xs) = head
         . groupWith length
         . last
         . groupWith sum
         . filter ((<= x) . sum)
         . nub
         $ subsequences xs

main = interact (show . f . read)
  • Eingabeformat: Liste in Klammern mit Kopf als verfügbarem Mana, Schwanz als verfügbare Zauber (z [4,1,2,3,3,7,6]. B. ).
  • Ausgabeformat: Liste der Listen in Klammern, wobei jede Unterliste einen möglichen Satz von Zaubersprüchen darstellt.

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.

FireFly
quelle
0

Mathematica 131

Es muss kürzere Wege geben, aber das konnte ich mir einfallen lassen.

l=Length;
f[{a_,b_}]:=Select[t=Cases[s=SortBy[Union@Cases[Subsets[b],x_/;0<Tr@x<a+1:>{x,Tr@x}],Last],
{x_,s[[-1,2]]}:> x],l@#==l@t[[1]]&]

f[{4, {1, 2, 3, 7, 6}}]

{{1, 3}}


f[{3, {1, 3, 5, 2, 10}}]

{{3}}


f[{8, {4, 1, 9}}]

{{4, 1}}


f[{4, {1, 2, 2, 3}}]

{{1, 3}, {2, 2}}

DavidC
quelle