Магія: Збір, оплата заклинань


9

Для отримання більшої кількості MtG-доброти: Магія: Збір боротьби зі здібностями

Приміщення:

У Magic: The Gathering, ви кидаєте заклинання, сплачуючи їх ману, натискаючи землі на необхідну суму. Ці землі можуть виробляти один з п'яти кольорів, які:

  • Білий (Вт)
  • Синій (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
Нікко Хресна

Також найкраще зазначити, що на перших позиціях у вартості завжди буде загальна мана (кількість), а потім слідують кольорові вимоги до мани (W / U / B / R / G)
Нікко Хресна

@NikkoKhresna Це було уточнено, дякую.
Веська


@Emigna син пістолета. Я думаю, що це інше в тому сенсі, що вам потрібно розібрати свої землі порівняно з тим, що вам просто дають пул мани.
Веська

Відповіді:


3

JavaScript (ES6), 91 байт

Вводиться як (cost)(lands):

  • cost - це список символів в BGRUWпорядку, з префіксом загальної частини, навіть коли він дорівнює0
  • lands - це список рядків.
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

Сітківка , 60 байт

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

Спробуйте в Інтернеті! Посилання включає тестові випадки. Пояснення:

\d+
*

Перетворіть родову ману в одинакову. При цьому використовуються повторні _s.

1,L`.*

Зрівняйте всі рядки після першого, тобто списку земель. (Зазвичай це знову збігатиметься в самому кінці вводу, але огляд за цим перешкоджає.)

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

Захопіть 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.
Ніл

О, це стосується 5 кольорових земель. Добре, моє погано
Нікко Хресна

1

Желе , 21 байт

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

Спробуйте в Інтернеті!

Виходи

Формат введення - це те, що дійсно ускладнює Jelly. Оскільки і змінювати масив, нам потрібно використовувати ©та ®додатково. З 3 окремими входами це було б 18 байт . (Хоча я впевнений, що 14-байтне рішення очікує, щоб його опублікував один із натурників Jelly.)



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)

Спробуйте в Інтернеті!

Ми розраховуємо на те, що всі кольори будуть вказані в одному порядку за вартістю та в земельному списку. Спочатку ми торкаємося земель, надаючи потрібну кольорову ману, а після цього просто перевіряємо, чи є у нас ще достатньо земель, щоб оплатити безбарвну вартість.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.