Em Magic: the Gathering, magos (conhecidos como "planeswalkers") lutam entre si lançando feitiços. Feitiços custam mana. Existem cinco cores de mana: branco, azul, preto, vermelho e verde, representados como {W}, {U}, {B}, {R} e {G}, respectivamente.
O custo de um feitiço é um pouco mais complexo. O custo pode ser qualquer combinação do seguinte:
- Uma ou mais cores
- Um ou mais incolor, representado como {X}, em que X é um número inteiro positivo
- Um ou mais híbridos, representados como {Y / Z}, em que Y e Z são uma cor (representada por uma das cinco letras) ou incolores, representados por um número inteiro positivo
As regras a seguir se aplicam ao tentar lançar um feitiço:
- Uma cor em um custo deve ser satisfeita por um mana dessa cor
- Um custo incolor {X} pode ser satisfeito por X mana de qualquer cor
- Um custo híbrido {Y / Z} pode ser satisfeito satisfazendo Y ou Z
- Observe que chaves não estão aninhadas
- Y e Z não são híbridos
Escreva um programa ou função que, dado um conjunto de mana e um custo, imprima ou retorne verdadeiro (ou algum valor verdadeiro) se e somente se o mana nesse conjunto puder satisfazer o custo, caso contrário, falso (ou algum valor falso).
Um pool de mana é uma sequência não vazia do formato:
Color1,Color2,Color3,...,Colorn-1,Colorn
Um custo é uma sequência não vazia do formato:
Cost1,Cost2,Cost3,...,Costn-1,Costn
Exemplos
No formato Pool Cost -> ExpectedOutput
(com um espaço entre Pool e 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
fonte
Respostas:
Pitão,
55535250 bytesExperimente on-line: demonstração ou equipamento de teste
Observe que a complexidade do tempo e da memória é muito ruim. Portanto, o segundo exemplo não funciona. Aloco cerca de 1,6 GB de RAM antes de travar na minha máquina.
Explicação
A explicação é para a solução 53. A única diferença é que a análise inicial acontece no meio, e não no começo.
Então aqui está a análise inicial.
Portanto, a entrada
"{W},{R},{R} {2/W},{W/B}"
é convertida em['w,r,r', '2/w,w/b']
.Então, o que isso faz? A entrada de custo
'2/w,w/b'
é convertida em:Toda corda
['aa', 'ab', 'ac', ..., 'zx', 'zy', 'zz', 'w']
satisfaz{2/W}
e todo caractere'wb'
satisfaz{w/b}
.Agora, geramos o produto cartesiano dessas listas (ou cadeias) e verificamos se alguma combinação pode ser produzida com o pool de mana.
fonte
True
eFalse
.K
. ColoqueKc-rz0"{}")
ondeK
é usado pela primeira vez e remova a atribuição inicial paraK
.Python 2.7, 412 caracteres
A função
f
é a que faz a verificação. Ele pega o pool de mana e o custo como argumentos de sequência e imprime1
quando o mana satisfaz o custo ou0
não. Por exemplo,f('{R},{R},{G},{B},{R}', '{4},{R}')
imprime1
.Sem jogar, basicamente se parece com isso
fonte