In Magic: the Gathering kämpfen Magier (bekannt als "Planeswalker") miteinander, indem sie Zauber wirken. Zauber kosten Mana. Es gibt fünf Manafarben: Weiß, Blau, Schwarz, Rot und Grün, dargestellt als {W}, {U}, {B}, {R} und {G}.
Die Kosten eines Zaubers sind etwas komplexer. Die Kosten können eine beliebige Kombination der folgenden sein:
- Eine oder mehrere Farben
- Eine oder mehrere farblose Zahlen, dargestellt als {X}, wobei X eine positive ganze Zahl ist
- Eine oder mehrere Hybriden, dargestellt als {Y / Z}, wobei Y und Z entweder eine Farbe (dargestellt durch einen der fünf Buchstaben) oder farblos sind, dargestellt durch eine positive ganze Zahl
Die folgenden Regeln gelten, wenn Sie versuchen, einen Zauber zu wirken:
- Eine Farbe in einem Preis muss durch ein Mana dieser Farbe befriedigt werden
- Ein farbloses Cost {X} kann durch X Mana einer beliebigen Farbe gedeckt werden
- Hybridkosten {Y / Z} können erfüllt werden, indem entweder Y oder Z erfüllt werden
- Beachten Sie, dass geschachtelte Klammern nicht vorhanden sind
- Y und Z sind nicht hybrid
Schreiben Sie ein Programm oder eine Funktion, die bei gegebenem Manapool und gegebenen Kosten true (oder einen gewissen Wahrheitswert) ausgibt oder zurückgibt, wenn das Mana in diesem Pool die Kosten decken kann, andernfalls false (oder einen gewissen falschen Wert).
Ein Manavorrat ist eine nicht leere Zeichenfolge des Formats:
Color1,Color2,Color3,...,Colorn-1,Colorn
Ein Kostenwert ist eine nicht leere Zeichenfolge des Formats:
Cost1,Cost2,Cost3,...,Costn-1,Costn
Beispiele
Im Format Pool Cost -> ExpectedOutput
(mit einem Leerzeichen zwischen Pool und Kosten):
{R},{R},{G},{B},{R} {4},{R} -> True
{G},{G},{G},{G},{W},{W},{W} {2/W},{2/U},{2/B},{2/R},{2/G} -> False
{G},{G},{R} {R/G},{G/B},{B/R} -> True
{R},{R},{R},{G} {1},{G},{2/G}-> True
{R} {R},{R},{R},{R},{R} -> False
{W},{R},{R} {2/W},{W/B} -> True
{U},{U} {1} -> True
{W},{R},{G} {1},{2} -> True
quelle
Antworten:
Pyth,
55535250 BytesProbieren Sie es online aus: Vorführ- oder Testgeschirr
Beachten Sie, dass die Zeit- und Speicherkomplexität sehr schlecht ist. Das zweite Beispiel funktioniert also nicht. Ich reserviere ungefähr 1,6 GB RAM, bevor es auf meinem Computer abstürzt.
Erläuterung
Die Erklärung gilt für die 53-Lösung. Der einzige Unterschied ist, dass das anfängliche Parsen in der Mitte und nicht am Anfang stattfindet.
Also hier ist die anfängliche Analyse.
Die Eingabe
"{W},{R},{R} {2/W},{W/B}"
wird also in konvertiert['w,r,r', '2/w,w/b']
.Also, was macht das? Der Kosteninput
'2/w,w/b'
wird umgewandelt in:Jede Zeichenfolge
['aa', 'ab', 'ac', ..., 'zx', 'zy', 'zz', 'w']
erfüllt{2/W}
und jeder Buchstabe'wb'
erfüllt{w/b}
.Nun generieren wir das kartesische Produkt dieser Listen (oder Strings) und prüfen, ob mit dem Manapool eine beliebige Kombination hergestellt werden kann.
quelle
True
undFalse
.K
. Legen Sie fest,Kc-rz0"{}")
woK
zuerst verwendet wird, und entfernen Sie die ursprüngliche Zuordnung zuK
.Python 2.7, 412 Zeichen
Die Funktion
f
ist diejenige, die die Prüfung durchführt. Es nimmt den Manavorrat und die Kosten als String-Argumente und gibt aus,1
wann das Mana die Kosten erfüllt und0
ansonsten. Zum Beispielf('{R},{R},{G},{B},{R}', '{4},{R}')
Ausdrucke1
.Ungolfed, es sieht im Grunde so aus
quelle