魔术:聚会,花钱买法术


9

要获得更多的MtG优点,请执行以下操作:魔术:具有能力的聚会战斗

前提:

在《魔法:汇聚》中,您可以通过按所需数量的土地支付法术力费用来施放咒语。这些土地可​​以产生以下五种颜色之一:

  • 白(W)
  • 蓝色(U)
  • 黑色(B)
  • 红色(R)
  • 绿色(G)

成本由两部分组成:一个数字(即通用的法术力要求)和一系列代表彩色法术力要求的符号。该数字是普通的法术力费用,可以使用任何颜色的法术力来满足它,例如(3)可以用支付WGG。这些符号是特定颜色的1:1要求。例如,WWUBR将需要2个白色法力,1个蓝色,1个黑色和1个红色。通用部分将始终位于彩色部分之前。提醒一下,这(0)是有效费用,必须处理。

您可以拥有完全通用的成本或完全彩色的成本,或两者都有。例如,以下卡牌的费用为4BB,并用4点法术值色和2点黑法术值支付:

范例卡

处于挑战中的土地将各自产生一个法力值。但是,我们将考虑可以产生多种颜色但仍然只产生1点法力的土地。例如,G将产生绿色的法术力,WG可以产生1个白色或1个绿色。

输入:

系统将为您提供两个输入,一张卡的费用和一张土地清单。

卡的成本可以是字符串,也可以是包含数字和彩色部分字符串的元组。如果没有通用部分,则可以用0填充字符串/元组。

土地列表将是一个字符串列表,其中每个字符串都是给定土地可以生产的。此列表可以为空(您没有土地)。您也可以使用位掩码逻辑将此列为整数列表,但如果这样做,则发布您的方案。如果重要的话,订购也取决于您,否则将按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
Nikko Khresna

还要提一提的是,费用始终会在第一个位置上包含通用的法术力需求(数字),然后是有色的法术力需求(W / U / B / R / G)
Nikko Khresna,

@NikkoKhresna澄清了,谢谢。
维斯卡


@Emigna的枪儿子。我想从需要解析土地到获得法力储备的意义上是不同的。
维斯卡

Answers:


3

JavaScript(ES6),91字节

输入为(cost)(lands)

  • CØsŤ是按BGRUW顺序排列的字符列表,带有通用部分的前缀,即使它是0
  • 一个ñds 是字符串列表。
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

Python 2中131个 129字节

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*

在线尝试!


2

视网膜,60字节

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

在线尝试!链接包括测试用例。说明:

\d+
*

将普通魔法转化为一元。这使用重复_的。

1,L`.*

匹配第一行(即土地列表)之后的所有行。(这通常会在输入的末尾再次匹配,但是后面的查找可以防止这种情况。)

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

在中捕获以1索引的行号$#1

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

用正则表达式替换每个土地,该正则表达式捕获与该土地或一般成本匹配的成本,但仅一次。

|'|

|s 连接生成的正则表达式。

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

将regex包装在^()*\n(我似乎无法在此处插入)。

~

计算该正则表达式在当前值上的匹配数。

示例:对于1BB¶WB¶WB¶WG生成的正则表达式为:

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

其中_BB¶WB¶WB¶WG根据需要相匹配。


WUBRG, WUBRG应该回来true吗?
Nikko Khresna,

@NikkoKhresna不,每个土地只能使用一次;您至少需要5土地才能支付WUBRG
尼尔,

哦,这是指5色土地。.好吧,我的坏蛋
Nikko Khresna,

1

果冻,21字节

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

在线尝试!

产出

输入格式确实使Jelly感到很难。因为修改数组,我们需要另外使用©®。如果有3个单独的输入,则为18个字节。(尽管我确定有一个Jelly策划者要等待大约14个字节的解决方案。)


1

Pyth,25个字节

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

在线尝试!

如果Pyth具有像Jelly's Œp这样的“数组的笛卡尔积”功能,这将很容易击败我的Jelly解决方案。目前由usM*GHQ]k


1

Perl 6的56 46个字节

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

在线尝试!

咖喱函数。(@lands)($generic_cost, $colored_costs)对于通用成本,将输入与显式0一样。基本思想是引入一个1表示一般法力的新符号,并使用Perl 6袋(多组)检查是否有可能从土地上获得所需的法力。

说明

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

在线尝试!

我们依靠这样的事实,即所有颜色将在成本和土地清单中以相同的顺序给出。首先,我们轻敲土地以提供所需的有色法力,然后检查我们是否仍有足够的土地来支付无色成本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.