Dungeon Master fue uno de los primeros juegos de rol en tiempo real, lanzado originalmente en 1987 en el Atari ST. Entre otras cosas interesantes para la época, ofrecía un sistema de hechizos bastante sofisticado basado en runas.
Tu tarea hoy es escribir un programa o función que evalúe la cantidad de puntos de maná necesarios para lanzar un hechizo dado en Dungeon Master.
El sistema de 'lanzamiento de hechizos' es el cuadro cian superior derecho en la imagen de arriba.
Hechizos, runas y maná
Los hechizos de Dungeon Master están compuestos de 2 a 4 runas, elegidas entre las siguientes categorías, en este orden exacto:
- Poder (obligatorio)
- Influencia elemental (obligatoria)
- Formulario (opcional)
- Clase / Alineamiento (opcional)
Significa que los hechizos válidos son:
- Poder + Influencia Elemental
- Poder + Influencia Elemental + Forma
- Poder + Influencia Elemental + Forma + Clase / Alineamiento
Cada categoría contiene 6 runas, y cada runa tiene un costo de maná base asociado:
=============================================================================
| Power | Rune | Lo | Um | On | Ee | Pal | Mon |
| +-----------+------+------+------+------+------+------+
| | Base cost | 1 | 2 | 3 | 4 | 5 | 6 |
=============================================================================
| Elemental Influence | Rune | Ya | Vi | Oh | Ful | Des | Zo |
| +-----------+------+------+------+------+------+------+
| | Base cost | 2 | 3 | 4 | 5 | 6 | 7 |
=============================================================================
| Form | Rune | Ven | Ew | Kath | Ir | Bro | Gor |
| +-----------+------+------+------+------+------+------+
| | Base cost | 4 | 5 | 6 | 7 | 7 | 9 |
=============================================================================
| Class / Alignment | Rune | Ku | Ros | Dain | Neta | Ra | Sar |
| +-----------+------+------+------+------+------+------+
| | Base cost | 2 | 2 | 3 | 4 | 6 | 7 |
=============================================================================
Evaluar el costo de maná
El costo de maná del hechizo es la suma del costo de maná de todas las runas:
El costo de la runa Power siempre es igual a su costo base (de 1 a 6).
Para las otras runas, se aplica la siguiente fórmula:
donde el poder es el costo base de la runa Power.
Ejemplos
Spell: Lo Ful
Cost : 1 + floor((1 + 1) * 5 / 2) = 1 + 5 = 6
Spell: Um Ful
Cost : 2 + floor((2 + 1) * 5 / 2) = 2 + 7 = 9
Spell: Pal Vi Bro
Cost : 5 + floor((5 + 1) * 3 / 2) + floor((5 + 1) * 7 / 2) = 5 + 9 + 21 = 35
Aclaraciones y reglas.
- Tu entrada consistirá en 2 a 4 cadenas que designan las runas del hechizo. Puede tomarlos en cualquier formato razonable, como 4 parámetros distintos, una matriz de cadenas (por ejemplo
['Lo', 'Ful']
), o solo una cadena con un separador de un solo carácter de su elección (por ejemplo'Lo Ful'
). Especifique el formato de entrada seleccionado en su respuesta. - Las runas están garantizadas para ser válidas.
- Se debe respetar el orden de las categorías. Las categorías no utilizadas pueden faltar o reemplazarse con algún valor falso.
- Puede aceptar las runas en cualquiera de estos formatos: 1. Una letra mayúscula seguida de minúscula (
'Ful'
) 2. Todas minúsculas ('ful'
) 3. Todas mayúsculas ('FUL'
). Pero no puedes mezclar diferentes formatos. - Obviamente, no nos importa saber si el hechizo realmente tiene algún efecto en el juego (para los hechizos curiosos y útiles se enumeran aquí ).
- Este es el código de golf , por lo que gana el código más corto en bytes.
- Y recuerda: ¡ Lord Chaos te está mirando!
Casos de prueba
Spell | Output
---------------+-------
Lo Ful | 6
Um Ful | 9
On Ya | 7
Lo Zo Ven | 12
Pal Vi Bro | 35
Ee Ya Bro Ros | 31
On Ful Bro Ku | 31
Lo Zo Kath Ra | 20
On Oh Ew Sar | 35
Ee Oh Gor Dain | 43
Mon Zo Ir Neta | 68
Mon Des Ir Sar | 75
fuente
Respuestas:
SOGL V0.12 ,
11078 bytesPruébalo aquí!
Probablemente podría jugar golf un byte o dos de rehacer todo
Explicación:
fuente
Python 2 ,
135119115 bytesPruébalo en línea!
La entrada es una lista de cadenas de stdin
fuente
05AB1E ,
8382 bytesPruébalo en línea!
-1 gracias a Emigna .
SOOOOOOO sin golf :(
Explicación:
fuente
.•Y<εΔ•
principio, no necesitas incrementar el índice.JavaScript (ES6),
1571561161121009997 bytesToma la entrada como una matriz de cadenas.
Pruébalo en línea!
Explicación
Hoo, muchacho, esto va a ser divertido: ¡mis explicaciones a soluciones triviales apestan en el mejor de los casos! Vamos a intentarlo ...
Una función anónima que toma la matriz como argumento mediante un parámetro
a
.Reduzca los elementos en la matriz pasando cada uno a través de una función; el
t
parámetro es el total acumulado, elc
parámetro es la cadena actual y0
es el valor inicial det
.Convierta el elemento actual de una cadena base 36 a un entero decimal.
Realice algunas operaciones de módulo en él.
Tome el carácter de la cadena en ese índice y conviértalo en un número.
Asigna ese número a la variable
v
.Verifique si la variable
a
es un número. Para el primer elementoa
será la matriz de cadenas, tratando de convertir eso en un número volveráNaN
, lo cual es falsey. En cada pase posterior,a
habrá un número entero positivo, que es verdadero.Si
a
es un número, lo multiplicamos por el valor dev
, sumamos el valor dev
y desplazamos los bits del resultado 1 bit a la derecha, lo que da el mismo resultado que dividir entre 2 y el piso.Si
a
no es un número, le asignamos el valorv
, lo que también nos dará un valor0
agregado a nuestro total en el primer pase.Finalmente, agregamos el resultado del ternario anterior a nuestro total acumulado.
Original, 156 bytes
fuente
a=>a.reduce((t,c)=>t+(v=+'27169735020045670435262'[parseInt(c,36)%141%83%50%23],+a?a*v+v>>1:a=v),0)
(EDITAR: eliminó un comentario irrelevante sobre enteros pasados en la entrada; parece que no entendí muy bien mi propio desafío ^^)JavaScript,
212210207206 bytesAlgoritmo de búsqueda directo, las cadenas de búsqueda solo contribuyen al total de bytes.
Código
Formato de entrada
Conjunto de cadenas, cada elemento es una cadena con mayúscula de primera letra. Ejemplo: ["Mon", "Zo", "Ir", "Neta"]
Explicación
Esto consulta los costos básicos.
Inicializa 2 variables con el primer elemento del resultado de la matriz anterior y elimina ese elemento. Primero se debe convertir al número; de lo contrario, se considerará como concatenación de cadenas en la siguiente parte.
Agrega los costos de las runas sin poder al poder base. Se usa desplazamiento en lugar de piso (bla) / 2.
Evaluar el último resultado. (Crédito: Paso gallina)
Casos de prueba
Edición 1: 212> 210: se eliminaron un par de llaves
Edición 2: 210> 207 - Gracias Step Hen por el recordatorio de las reglas de JS y algunos consejos sobre el uso de la función eval (). Como AS3 prohíbe el uso de eval (), no lo he usado en mucho tiempo
Edición 3: 207> 206 - Gracias Shaggy por la idea de reemplazar indexOf () con search ()
fuente
g
adentrog
, permitimos que las respuestas de JS eliminen elg=
. Además, puede guardar un par de bytes cambiándolo a una evaluación y eliminandoreturn
: Fiddlesearch
te ahorrará unos bytesindexOf
.Haskell ,
159156148133130127 bytesPruébalo en línea!
fuente
Python 2 ,
320 318 314 311307 bytesFormato de entrada lista de cadenas. Programa completo:
Pruébalo en línea!
fuente
Excel, 339 bytes
Entradas ingresadas a
A1
través deD1
. Fórmula en cualquier otra celda.Alternativamente, importando como CSV:
Excel y CSV, 228 bytes
Entrada ingresada en la primera fila,
SPACE
para nulos. El resultado se muestra en A3.fuente
SCALA, 1106 caracteres, 1106 bytes
Esto es bastante largo, probablemente optimizable, pero fue divertido hacerlo :)
Formato de entrada : runas separadas por espacios en una cadena. Si solo hay 2 entradas (como "Lo Ful"), mi código lo completa
while(k.length<4)k:+=""
(por lo que puedo guardar 24 bytes cambiando los parámetros, si requiero que sea "ABC D").while(k.length<4)k:+=""
Gracias por este excelente desafío. Pruébalo en línea!
fuente
Lenguaje de programación Shakespeare , 4420 bytes
Toma la entrada como una cadena en mayúscula.
Explicación próximamente ... Por ahora, Dato curioso:
Microsoft
es un sustantivo negativo en SPL. Todas las otras palabras aceptadas aparecieron en las obras de Shakespeare.Pruébalo en línea!
fuente
Java (OpenJDK 8) , 252 bytes
Pruébalo en línea!
Las runas se ingresan como un
String[]
(conjunto deString
), en la forma de primer caso (la primera letra es mayúscula, el resto es minúscula).Es el método estándar de "encontrar el enésimo letra", con el giro que tanto
Ros
yRa
existen en el cuarto segmento. Lo traté con un reemplazo en línea y explícito deRa
toX
.fuente
Retina ,
124123 bytesPruébalo en línea! El enlace incluye casos de prueba. Toma runas separadas por espacios. Explicación: Las etapas iniciales simplemente convierten cada runa en un dígito, que luego se convierte en unario. Los números después del primero se multiplican por uno más que el primer número, después de lo cual se duplica el primer número. El número entero de la etapa final divide todo el resultado entre 2 y toma la suma.
fuente
C, 274
Más no golfista:
Debe proporcionar cuatro argumentos de línea de comando, por lo que para el primer caso de prueba debe ejecutar
./a.out Lo Ful "" ""
fuente
Go, 205 bytes
Es una función invocable, toma runas como una porción de cadenas, por ejemplo
[]string{"Um", "Ful"}
.Pruébalo en Go Playground .
fuente
Haskell, 623 bytes
Usar ADT en lugar de vudú numérico.
NOTA: Agregue 36 para
{-# LANGUAGE GADTs,ViewPatterns #-}
-XGADTs -XViewPatterns
Entrada: un solo hechizo como una cadena normal, por ejemplo
Lo Ful
Um Ful
La multilínea se puede hacer reemplazando la última línea con
Pero esto agregaría bytes al recuento
fuente