En Magic: the Gathering, los magos (conocidos como "planeswalkers") luchan entre sí lanzando hechizos. Los hechizos cuestan maná. Existen cinco colores de maná: blanco, azul, negro, rojo y verde, representados como {W}, {U}, {B}, {R} y {G}, respectivamente.
El costo de un hechizo es un poco más complejo. El costo puede ser cualquier combinación de lo siguiente:
- Uno o mas colores
- Uno o más incoloros, representados como {X}, donde X es un entero positivo
- Uno o más híbridos, representados como {Y / Z}, donde Y y Z son de color (representado por una de las cinco letras) o incoloro, representado por un número entero positivo
Las siguientes reglas se aplican al intentar lanzar un hechizo:
- Un color en un costo debe ser satisfecho por un maná de ese color
- Un coste incoloro {X} puede ser satisfecho por X mana de cualquier color
- Un costo híbrido {Y / Z} puede satisfacerse satisfaciendo Y o Z
- Tenga en cuenta que las llaves no están anidadas
- Y y Z no son híbridos
Escriba un programa o función que, dado un grupo de maná y un costo, imprima o devuelva verdadero (o algún valor verdadero) si y solo si el maná en ese grupo puede satisfacer el costo, de lo contrario falso (o algún valor falso).
Un grupo de maná es una cadena no vacía del formato:
Color1,Color2,Color3,...,Colorn-1,Colorn
Un costo es una cadena no vacía del formato:
Cost1,Cost2,Cost3,...,Costn-1,Costn
Ejemplos
En el formato Pool Cost -> ExpectedOutput
(con un espacio entre Pool y 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
fuente
Respuestas:
Pyth,
55535250 bytesPruébelo en línea: demostración o prueba de arnés
Tenga en cuenta que la complejidad del tiempo y la memoria es realmente mala. Entonces el segundo ejemplo no funciona. Asigno aproximadamente 1.6 GB de RAM antes de que se bloquee en mi máquina.
Explicación
La explicación es para la solución 53. La única diferencia es que el análisis inicial ocurre en el medio en lugar del comienzo.
Así que aquí está el análisis inicial.
Entonces la entrada
"{W},{R},{R} {2/W},{W/B}"
se convierte en['w,r,r', '2/w,w/b']
.Entonces que hace esto? El costo de entrada
'2/w,w/b'
se convierte en:Cada cadena en
['aa', 'ab', 'ac', ..., 'zx', 'zy', 'zz', 'w']
satisface{2/W}
y cada char en'wb'
satisface{w/b}
.Ahora generamos el producto cartesiano de estas listas (o cadenas) y vemos si se puede producir alguna combinación con el grupo de maná.
fuente
True
yFalse
.K
. ColoqueKc-rz0"{}")
dóndeK
se usa por primera vez y elimine la asignación inicial aK
.Python 2.7, 412 caracteres
La función
f
es la que hace la verificación. Toma el grupo de maná y el costo como argumentos de cadena, e imprime1
cuando el maná satisface el costo y de lo0
contrario. Por ejemplo,f('{R},{R},{G},{B},{R}', '{4},{R}')
impresiones1
.Ungolfed, básicamente se ve así
fuente