マジック:収集、呪文の支払い


9

MtG-goodness:Magic:The Gathering Combat with Abilitiesの詳細

前提:

マジック:ザギャザリングでは、必要な量の土地をタップしてマナコストを支払うことで、呪文を唱えます。これらの土地は、次の5つの色のいずれかを生成できます。

  • ホワイト(W)
  • 青(U)
  • 黒(B)
  • 赤(R)
  • 緑(G)

コストは2つの部分で構成されています。一般的なマナ要件である数と、色のマナ要件を表す一連のシンボルです。数値は一般的なマナコストであり、任意の色のマナを使用して満たすこと(3)ができますWGG。たとえば、で支払うことができます。シンボルは、特定の色の1:1の要件です。たとえばWWUBR、2つの白マナ、1つの青、1つの黒、1つの赤が必要です。Genericパーツは常にColoredパーツの前に来ます。注意として、(0)は有効なコストであり、処理する必要があります。

完全に汎用的であるか、完全に色付けされているか、またはその両方のコストを持つことができます。たとえば、次のカードのコストは4BBで、色のマナ4つと黒のマナ2つが支払われます。

カードの例

この挑戦の土地はそれぞれ1マナを生み出します。ただし、複数の色を生成できるが、1マナしか得られない土地を検討します。たとえばG、緑のマナWGを生成し、1つの白または1つの緑を生成できます。

入力:

カードのコストと土地のリストの2つの入力が与えられます。

カードのコストは、文字列、または色の部分の数字と文字列を含むタプルのいずれかです。一般的な部分がない場合は、文字列/タプルに0を埋め込むことができます。

土地リストは文字列のリストであり、それぞれが特定の土地で生成できるものです。このリストは空にすることができます(土地がない場合)。これをビットマスクロジックを使用してintのリストとして取得することもできますが、そうする場合はスキームをポストします。それが重要である場合、注文もあなた次第です。それ以外の場合は、WUBRG注文が想定されます。

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

出力:

truthyあなたの土地に与えられたコストを首尾よく支払うことができる場合の価値と、あなたが支払うfalseyことができない場合の価値。

ルール:

  • 有効な入力が保証されます
  • マナは常に「WUBRG」の順番であると想定されます。別の注文が必要な場合は、回答にその旨を明記してください。
  • 色は常にコストでグループ化されます。例:「WWUBBRG」
  • 入力には、すべて大文字またはすべて小文字のいずれかを使用します。
  • 正規表現127[WUBRG]{127}と254の土地を処理できるはずです。
  • 禁止されている標準の抜け穴
  • これは、言語の勝利ごとの最短の答えです

例:

"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

mtgチャレンジがありうれしい。+1
日光ケレスナ

また、コストには常に最初の位置に一般的なマナ要件(数)があり、その後に色付きのマナ要件(W / U / B / R / G)が続くことにも言及するのが最もよい
Nikko Khresna

@NikkoKhresnaそれは明確になりました、ありがとう。
Veskah 2018年


銃の@エミグナの息子。マナプールを与えられるだけと比べて、土地を解析する必要があるという意味では違うと思います。
Veskah

回答:


3

JavaScript(ES6)、91バイト

入力を(cost)(lands)次のように受け取ります:

  • costBGRUW0
  • lads
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)))

オンラインでお試しください!

コメントしました

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


2

Retina、60バイト

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

オンラインでお試しください!リンクにはテストケースが含まれます。説明:

\d+
*

一般マナを単項に変換します。これは繰り返される_sを使用します。

1,L`.*

最初の行以降のすべての行、つまり土地のリストに一致します。(これは通常、入力の最後で再び一致しますが、後読みはそれを防ぎます。)

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

1でインデックス付けされた行番号をでキャプチャし$#1ます。

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

各土地を、その土地または一般的なコストに一致するコストをキャプチャする正規表現で置き換えますが、1回だけです。

|'|

結果の正規表現を|sで結合します。

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

正規表現をラップし^()*\nここに挿入できないようです)。

~

現在の値に対するその正規表現の一致数を数えます。

例:1BB¶WB¶WB¶WG生成された正規表現の場合:

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

_BB¶WB¶WB¶WG必要に応じて一致します。


WUBRG, WUBRG戻る必要がありtrueますか?
日光ケレスナ

@NikkoKhresnaいいえ、各土地は一度しか使用できません。あなたが支払うことができるようにするには、少なくとも5つの土地が必要ですWUBRG
Neil、

ああ、それは5色を参照するには、私の悪いland..okay
日興Khresna

1

ゼリー、21バイト

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

オンラインでお試しください!

アウトプット

入力フォーマットは、ジェリーにとってこれを本当に難しくしているものです。ので及び配列を変更する、我々は、使用する必要があります©し、®加えて。3つの別々の入力がある場合、これは18バイトになります。(確かに、ゼリーの首謀者の1人から投稿されるのを待っているバイトソリューションは14ほどあるはずです。)



1

Perl 6の56の 46バイト

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

オンラインでお試しください!

カレー機能。(@lands)($generic_cost, $colored_costs)一般的なコストの明示的な0と同様に入力を受け取ります。基本的な考え方は、1一般的なマナを表す新しいシンボルを導入し、Perl 6 Bags(マルチセット)を使用して、土地から必要なマナを取得できるかどうかを確認することです。

説明

{ ... }  # 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

1

Haskell、94バイト

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)

オンラインでお試しください!

私たちはすべての色がコストと土地リストで同じ順序で与えられるという事実に依存しています。まず、土地をタップして必要な色のマナを与え、その後、無色のコストを支払うのに十分な土地があることを確認します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.