Magie: Das Sammeln, Bezahlen von Zaubersprüchen

9

Für mehr MtG-Güte: Magie: Der Sammelkampf mit Fähigkeiten

Prämisse:

In Magic: the Gathering zauberst du Zauber, indem du ihre Manakosten bezahlst, indem du Land für den erforderlichen Betrag tippst. Diese Länder können eine der fünf Farben erzeugen, die sind:

  • Weiß (W)
  • Blau (U)
  • Schwarz (B)
  • Rot (R)
  • Grün (G)

Die Kosten setzen sich aus zwei Teilen zusammen: einer Zahl, die die allgemeine Manaanforderung darstellt, und einer Reihe von Symbolen, die die farbige Manaanforderung darstellen. Die Zahl gibt die generischen Manakosten an und kann jede Manafarbe verwenden, um sie zu befriedigen, z. B. (3)kann mit bezahlt werden WGG. Die Symbole sind eine 1: 1-Anforderung einer bestimmten Farbe. zB WWUBRwürde 2 weißes Mana, 1 blaues, 1 schwarzes und 1 rotes erfordern. Der generische Teil steht immer vor dem farbigen Teil. Zur Erinnerung, (0)ist eine gültige Kosten und muss behandelt werden.

Sie können Kosten haben, die ganz allgemein oder ganz farbig sind oder beides. Zum Beispiel kostet die folgende Karte 4BB und wird mit 4 farbigen Manas und 2 schwarzen Manas bezahlt:

Beispielkarte

Länder in dieser Herausforderung produzieren jeweils ein Mana. Wir werden jedoch Länder betrachten, die mehrere Farben erzeugen können, aber dennoch nur 1 Mana liefern. ZB Gerzeugt ein grünes Mana, WGkann entweder 1 Weiß oder 1 Grün produzieren.

Eingang:

Sie erhalten zwei Eingaben, die Kosten einer Karte und eine Liste der Länder.

Die Kosten der Karte können entweder eine Zeichenfolge oder ein Tupel sein, das eine Zahl und eine Zeichenfolge für den farbigen Teil enthält. Wenn es keinen generischen Teil gibt, können Sie den String / das Tupel mit einer 0 auffüllen.

Die Landliste ist eine Liste von Zeichenfolgen, in denen jede einzelne das ist, was ein bestimmtes Land produzieren kann. Diese Liste kann leer sein (Sie haben kein Land). Sie können dies auch als Liste von Ints mithilfe der Bitmaskenlogik verwenden, aber wenn Sie dies tun, veröffentlichen Sie Ihr Schema. Die Bestellung liegt auch bei Ihnen, wenn es darauf ankommt, andernfalls wird sie in der richtigen WUBRGReihenfolge angenommen .

#Example input formats
"4BB", ("WG","B","B") #
(4,"BB"), (7,3,3)     #Both should return falsy

Ausgabe:

Ein truthyWert, wenn Sie die Kosten für Ihr Land erfolgreich bezahlen können, und ein falseyWert, wenn Sie dies nicht können.

Regeln:

  • Ihnen wird eine gültige Eingabe garantiert
  • Mana wird immer in der Reihenfolge "WUBRG" angenommen. Wenn Sie eine andere Reihenfolge wünschen, geben Sie dies in Ihrer Antwort an.
  • Farben werden immer in den Kosten gruppiert, zB "WWUBBRG"
  • Bei der Eingabe werden entweder Großbuchstaben oder Kleinbuchstaben Ihrer Wahl verwendet.
  • Sie sollten in der Lage sein, mit Regex 127[WUBRG]{127}und 254 Ländern umzugehen .
  • Standardlücken verboten
  • Dies ist , die kürzeste Antwort pro Sprache gewinnt

Beispiele:

"0", ("")                => 1
"1BB", ("WG","B","B")    => 1
"BB", ("WG","B","B")     => 1
"WB", ("WG","B","B")     => 1
"1UB", ("W","U","B")     => 1
"1BB", ("WB","WB","WG")  => 1
"1", ("WG","B","B")      => 1
"1BB", ("WGR","WB","WB") => 1
"WUBRG", ("W","U","B","R","G")  => 1
"1WWUBB", ("W","WG","U","B","B","R")  => 1
"10BB", ("WGR","WB","WB","B","B","B","B","B","B","B","B","B") => 1

"R", ("")                => 0
"4", ("WG","B","B")      => 0
"1BB", ("WG","WB")       => 0
"1UB", ("WG","W","UB")   => 0
"1UBR", ("W","WG","UBR") => 0
"WUBRG", ("WUBRG")       => 0
"1WWUBB", ("W","WG","U","B","B")  => 0
"10UU", ("WGR","WB","WB","B","B","B","B","B","B","B","B","B") => 0
Veskah
quelle
Ich bin froh, dass es eine MTG-Herausforderung gibt. +1
Nikko Khresna
Erwähnen Sie auch am besten, dass die Kosten immer die allgemeine Manaanforderung (die Anzahl) an erster Stelle haben, gefolgt von den Anforderungen an farbiges Mana (W / U / B / R / G)
Nikko Khresna,
@NikkoKhresna Das wurde geklärt, danke.
Veskah
@ Emigna Sohn einer Waffe. Ich denke, es ist anders in dem Sinne, dass du dein Land analysieren musst, als nur den Manavorrat zu bekommen.
Veskah

Antworten:

3

JavaScript (ES6), 91 Byte

Nimmt Eingabe als (cost)(lands):

  • cÖstBGRUW0
  • leinnds
a=>g=([c,...r],n=0,s=e='')=>[...n+s].sort()+e==a|(c&&[e,e,...c].some((c,i)=>g(r,n+!i,s+c)))

Probieren Sie es online aus!

Kommentiert

a =>                        // main function taking the array a[] describing the cost
  g = (                     // g = recursive function taking:
    [c, ...r],              //   c = next land string; r[] = remaining land strings
    n = 0,                  //   n = generic mana, initialized to 0
    s = e = ''              //   s = generated cost string, initialized to e = empty string
  ) =>                      //
    [...n + s].sort() + e   // prepend n to s, split, sort and force coercion to a string
    == a | (                // if this is matching a[], the test is successful
      c &&                  // if c is defined:
      [                     //   try the following recursive calls:
        e,                  //     - increment n and append nothing to s
        e,                  //     - do nothing
        ...c                //     - leave n unchanged and append a character to s
      ].some((c, i) =>      //   for each c at position i in the above array:
        g(r, n + !i, s + c) //     process the recursive call
      )                     //   end of some()
    )                       // end of the recursive part
Arnauld
quelle
2

Python 2 , 131 129 Bytes

lambda (g,c),m:any(all(c[i]in p[i]for i in range(l(c)))for p in permutations(m,l(c)))*(g<=l(m)-l(c))
l=len
from itertools import*

Probieren Sie es online aus!

TFeld
quelle
2

Netzhaut , 60 Bytes

\d+
*
~["^("|'|]")*\n"1,L$`(?<=(^|.*¶)+).*
(?($#1)^|([_$&]))

Probieren Sie es online aus! Link enthält Testfälle. Erläuterung:

\d+
*

Wandle das generische Mana in unär um. Dies verwendet wiederholte _s.

1,L`.*

Passen Sie alle Zeilen nach der ersten an, dh die Liste der Länder. (Dies würde normalerweise am Ende der Eingabe wieder übereinstimmen, aber das Aussehen verhindert dies.)

(?<=(^|.*¶)+)

Erfassen Sie die 1-indizierte Zeilennummer in $#1.

$
(?($#1)^|([_$&]))

Ersetzen Sie jedes Land durch einen regulären Ausdruck, der die Kosten erfasst, die diesem Land entsprechen, oder generische Kosten, jedoch nur einmal.

|'|

Verbinden Sie die resultierenden regulären Ausdrücke mit |s.

["^("]")*\n"

Wickeln Sie den regulären Ausdruck in ^(und ein )*\n(ich kann hier scheinbar keinen einfügen ).

~

Zählen Sie die Anzahl der Übereinstimmungen dieser Regex mit dem aktuellen Wert.

Beispiel: Für den Fall des 1BB¶WB¶WB¶WGgenerierten regulären Ausdrucks gilt:

^((?(2)^|([_WB]))|(?(3)^|([_WB]))|(?(4)^|([_WG])))*\n

welches _BB¶WB¶WB¶WGnach Bedarf passt.

Neil
quelle
WUBRG, WUBRGsollte zurückkehren true?
Nikko Khresna
@NikkoKhresna Nein, jedes Land darf nur einmal genutzt werden. Sie benötigen mindestens 5 Länder, um bezahlen zu können WUBRG.
Neil
Oh, das bezieht sich auf 5 Farben Land. Okay, mein Schlechtes
Nikko Khresna
1

Gelee , 21 Bytes

Œpµ®œ-)Ạ
L<⁴Ṫ©L+Ḣ¤ȯçṆ

Probieren Sie es online aus!

Ausgänge

Das Eingabeformat macht es Jelly wirklich schwer. Weil und modifizieren Sie das Array, müssen wir ©und ®zusätzlich verwenden. Bei 3 separaten Eingängen wären dies 18 Bytes . (Obwohl ich sicher bin, dass es eine 14-Byte-Lösung gibt, die darauf wartet, von einem der Jelly-Masterminds veröffentlicht zu werden.)

PurkkaKoodari
quelle
1

Pyth , 25 Bytes

&glQ+hAElH}k.-LHusM*GHQ]k

Probieren Sie es online aus!

Wenn Pyth eine "Cartesian Product of Array" -Funktion wie die von Jelly hätte Œp, würde dies meine Jelly-Lösung leicht übertreffen. Derzeit wird das von erledigt usM*GHQ]k.

PurkkaKoodari
quelle
1

Perl 6 , 56 46 Bytes

{(1 x*~*).comb.Bagany [X] $(1 X~$_)>>.comb}

Probieren Sie es online aus!

Curry-Funktion. Nimmt Eingaben wie (@lands)($generic_cost, $colored_costs)bei einer expliziten 0 für allgemeine Kosten vor. Die Grundidee besteht darin, ein neues Symbol 1für generisches Mana einzuführen und mithilfe von Perl 6-Beuteln (Multisets) zu prüfen, ob es möglich ist, das erforderliche Mana aus Ländern zu erhalten.

Erläuterung

{ ... }  # Anonymous block returning WhateverCode
  # Preprocess cost
  1 x*    # '1' for generic mana repeated times generic cost
      ~*  # Concat with colored costs
 (      ).comb  # Split into characters
              .Bag  # Convert to a Bag (multiset)
                             # Preprocess lands
                             1 X~$_   # Prepend '1' to each land
                           $(      )  # Itemize to make 1-element lists work
                                    >>.comb  # Split each into chars
                       [X]  # Cartesian product, yields all possible ways
                            # to select colors from lands
                  # Finally check if the cost Bag is a subset of any possible
                  # color selection (which are implicitly converted to Bags)
                  any
nwellnhof
quelle
1

Haskell , 94 Bytes

x#[]=[]
x#(s:t)|x`elem`s=t|0<1=s:x#t
(e,[])?s=length s>=e
(e,x:y)?s|x#s==s=0>1|0<1=(e,y)?(x#s)

Probieren Sie es online aus!

Wir verlassen uns darauf, dass alle Farben in der gleichen Reihenfolge in den Kosten und in der Landliste angegeben werden. Zuerst tippen wir auf die Länder, die das erforderliche farbige Mana ergeben, und überprüfen anschließend, ob wir noch genügend Länder haben, um die farblosen Kosten zu bezahlen.

Max Yekhlakov
quelle