В Magic: The Gathering, маги (известные как "planeswalker") сражаются друг с другом, используя заклинания. Заклинания стоят маны. Существует пять цветов маны: белый, синий, черный, красный и зеленый, представленные как {W}, {U}, {B}, {R} и {G} соответственно.
Стоимость заклинания немного сложнее. Стоимость может быть любой комбинацией следующего:
- Один или несколько цветов
- Один или несколько бесцветных, представленных как {X}, где X - положительное целое число
- Одна или несколько гибридов, представленных как {Y / Z}, где Y и Z являются либо цветом (представленным одной из пяти букв), либо бесцветным, представленным положительным целым числом
Следующие правила применяются при попытке разыграть заклинание:
- Цвет в стоимости должен быть удовлетворен одной маной этого цвета
- Бесцветная стоимость {X} может быть удовлетворена за счет X маны любого цвета
- Гибридная стоимость {Y / Z} может быть удовлетворена путем удовлетворения либо Y, либо Z
- Обратите внимание, что фигурные скобки не являются вложенными
- Y и Z не гибридные
Напишите программу или функцию, которая, учитывая пул маны и стоимость, печатает или возвращает истину (или некоторое истинное значение) тогда и только тогда, когда мана в этом пуле может удовлетворить стоимость, иначе ложь (или некоторое ложное значение).
Пул маны - это непустая строка в формате:
Color1,Color2,Color3,...,Colorn-1,Colorn
Стоимость - это непустая строка в формате:
Cost1,Cost2,Cost3,...,Costn-1,Costn
Примеры
В формате Pool Cost -> ExpectedOutput
(с пробелом между Pool и Cost):
{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
источник
Ответы:
Pyth,
55535250 байтПопробуйте онлайн: демонстрация или тестовая привязь
Обратите внимание, что время и сложность памяти действительно плохие. Так что второй пример не работает. Я выделяю около 1,6 ГБ оперативной памяти до того, как она выйдет из строя на моей машине.
объяснение
Объяснение для 53 решения. Разница лишь в том, что первоначальный разбор происходит в середине, а не в начале.
Итак, вот начальный разбор.
Таким образом, ввод
"{W},{R},{R} {2/W},{W/B}"
преобразуется в['w,r,r', '2/w,w/b']
.Так, что это делает? Ввод затрат
'2/w,w/b'
преобразуется в:Каждая строка в
['aa', 'ab', 'ac', ..., 'zx', 'zy', 'zz', 'w']
удовлетворяет,{2/W}
и каждый символ в'wb'
удовлетворяет{w/b}
.Теперь мы сгенерируем декартово произведение этих списков (или строк) и посмотрим, можно ли с помощью мана-пула создать любую комбинацию.
источник
True
иFalse
.K
. Поместите,Kc-rz0"{}")
гдеK
используется в первый раз, и удалите начальное назначениеK
.Python 2.7, 412 символов
Эта функция
f
выполняет проверку. Он принимает пул маны и стоимость в качестве строковых аргументов и печатает,1
когда мана удовлетворяет стоимости, и в0
противном случае. Например,f('{R},{R},{G},{B},{R}', '{4},{R}')
печатает1
.В общем, это выглядит так
источник