¿Cuánto maná necesito?


33

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.

Captura de pantalla de 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:

  1. Poder (obligatorio)
  2. Influencia elemental (obligatoria)
  3. Formulario (opcional)
  4. 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:

    costo = piso ((potencia + 1) * base_cost / 2)

    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 , 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

1
Tangencial, pero para las personas a las que les gusta este sistema, The Magical Land of Wozz es un juego japonés SNES (traducción al inglés disponible) que implementa casi el mismo sistema, donde cualquier cadena de letras se convierte en un hechizo. google.co.jp/webhp?ie=UTF-8#q=magical+land+of+wozz
Coty Johnathan Saxman

Tengo un vago recuerdo de ver a alguien jugar Dungeon Master (no creo que fuera en el ST). Habían equipado a uno de sus luchadores con un collar mágico, y de vez en cuando comprobarían si se había recargado y, de ser así, lanzarían otra runa de lo que creo que era un hechizo productor de luz de algún tipo, para que el luchador pudiera lanzar este hechizo cada diez minutos más o menos, y finalmente ganó un nivel en hechicería.
Neil

@Neil Este collar probablemente era la Piedra lunar (+3 Maná) o el Colgante Feral (+1 Habilidad de mago). Todos los artículos están listados aquí .
Arnauld

este script debería generar todas las combinaciones de entrada posibles
NieDzejkob

Respuestas:


6

SOGL V0.12 , 110 78 bytes

θKKι"LUOEPM”;W:A≤{B"⁶Μ↓§QΕņj“L─"¶Ζq«╝γDyΜ2¶S◄Μ$‘č¹I6nēwι{_Cb:ƧRA=┌*ΚKι=?aIc*»+

Pruébalo aquí!

Probablemente podría jugar golf un byte o dos de rehacer todo

Explicación:

θ            split on spaces
 K           pop the 1st item
  K          pop from the string the 1st character
   ι         remove the original string from stack
    "”;W     get the chars index in "LUOEPM"
        :A   save a copy to variable A
          ≤  put the power (used as the mana) on the bottom of the stack (with the thing above being the input array)

{            for the leftover items in the input do
 B             save the current name on B
  "..“         push 456779223467234567
      L─       base-10 decode it (yes, silly, but it converts it to an array of digits)
        ".‘    push "VEKIBGKRDN-SYVOFDZ"

      č        chop to characters
       ¹       create an array of those two
        I      rotate clockwise
         6n    group to an array with sub-arrays of length 6 (so each array in the array contains 3 items, corresponding to the categories, each with 6 arrays with the runes 1st letter (or "-" in the case of Ra) and base cost)
           ē   push variable e (default = user input number, which errors and defaults to 0) and after that increase it (aka `e++`)
            w  get that item in the array (the array is 1-indexed and the variable is not, so the array was created shifted (which somehow saves 0.9 ≈ 1 byte in the compression))

 ι             remove the original array
  {            for each in that (current category) array
   _             dump all contents on stack (so pushing the runes name and then base cost)
    C            save pop (base cost) on variable B
     b:          duplicate the name
       ƧRA=      push if pop = "RA"
           ┌*    get that many (so 0 or 1) dashes
             Κ   prepend the "" or "-" to the name
              K  pop the 1st letter of the name
               ι remove the modified name, leaving the 1st letter on the stack

         =?      if top 2 are equal (one of the dumped items and the 1st letter of the current inputs)
           a       push variable A (the power)
            I      increase it
             c     push variable C (the current base cost)
              *    multiply
               »   floor-divide by 2
                +  add that to the power

2
eso es lo que lo hace aún más interesante
Walfrat

¿Puedes agregar una explicación?
CalculatorFeline

@CalculatorFeline Se olvidó un poco de esta respuesta. Probablemente
juegue al

17

Python 2 , 135 119 115 bytes

b=[int('27169735 2  4567 435262'[int(x,36)%141%83%50%23])for x in input()]
print b[0]+sum(a*-~b[0]/2for a in b[1:])

Pruébalo en línea!

La entrada es una lista de cadenas de stdin


Outgolfed ...>. <
Mr. Xcoder

También he copiado su método de entrada TIO a mi respuesta, espero que no le importe.
Sr. Xcoder

@ Mr.Xcoder He incluido todos los casos de prueba. Puede copiarlos si lo desea
2017

Oo, bien hecho en la indexación, ¿te importa si lo tomo prestado para mi solución JS?
Shaggy

11

05AB1E , 83 82 bytes

.•Y<εΔ•¹нk©.•M₄P畲нkÌ.•Jrû •³нkD(i\ë4 3‡4+}.•A1Δ#•I4èkD(i\ë3LJ012‡Ì})ćsv®>y*;(î(+

Pruébalo en línea!

-1 gracias a Emigna .

SOOOOOOO sin golf :(

Explicación:

.•Y<εΔ•¹нk©.•M₄P畲нkÌ.•Jrû •³нkD(i\ë4 3‡4+}.•A1Δ#•I4èkD(i\ë3LJ012‡Ì})ćsv®>y*;(î(+ Accepts four runes as separate lines, lowercase. Use Ø for missing runes.
.•Y<εΔ•¹нk©                                                                        Index first letter of first rune into "aluoepm" ("a" makes 1-indexed)
           .•M₄P畲нkÌ                                                             Index first letter of second rune into "yvofdz", 2-indexed.
                      .•Jrû •³нkD(i\ë4 3‡4+}                                       Index first letter of third rune into "vekibg", 0-indexed, if it's not there pop, else, if index is 4 replace with 3, else keep as-is, then increment by 4.
                                            .•A1Δ#•I4èkD(i\ë3LJ012‡Ì}              Index fourth letter (modular wrapping) of fourth rune into "kodnra", if it's not there pop, else, if index is one of 1, 2 or 3, replace with 0, 1 or 2 respectively, else keep as-is, then increment by 2.
                                                                     )ćs           Wrap all numbers into a list, keeping the power rune behind.
                                                                        v          For each
                                                                         ®>y*;(î(   Apply the formula
                                                                                 +  Add to total sum

Un pequeño golf sería que si indexas al .•Y<εΔ•principio, no necesitas incrementar el índice.
Emigna

@Emigna Ooh aún no tuvo tiempo de intentarlo ...
Erik the Outgolfer

11

JavaScript (ES6), 157 156 116 112 100 99 97 bytes

Toma la entrada como una matriz de cadenas.

a=>a.map(c=>t+=(v=+`27169735020045670435262`[parseInt(c,36)%141%83%50%23],+a?a*v+v>>1:a=v),t=0)|t
  • Ahorró 44 bytes masivos al tomar prestado el truco de indexación de la solución Python de ovs : si está votando esta respuesta, por favor, vote también esa.
  • Ahorró 13 bytes gracias a que Arnauld señaló lo que debería haber sido una oportunidad obvia para usar un ternario.

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 ...

a=>

Una función anónima que toma la matriz como argumento mediante un parámetro a.

a.reduce((t,c)=>,0)

Reduzca los elementos en la matriz pasando cada uno a través de una función; el tparámetro es el total acumulado, el cparámetro es la cadena actual y 0es el valor inicial de t.

parseInt(c,36)

Convierta el elemento actual de una cadena base 36 a un entero decimal.

%141%83%50%23

Realice algunas operaciones de módulo en él.

+`27169735 2  4567 435262`[]

Tome el carácter de la cadena en ese índice y conviértalo en un número.

v=

Asigna ese número a la variable v.

+a?

Verifique si la variable aes un número. Para el primer elemento aserá la matriz de cadenas, tratando de convertir eso en un número volverá NaN, lo cual es falsey. En cada pase posterior, ahabrá un número entero positivo, que es verdadero.

a*v+v>>1

Si aes un número, lo multiplicamos por el valor de v, sumamos el valor de vy desplazamos los bits del resultado 1 bit a la derecha, lo que da el mismo resultado que dividir entre 2 y el piso.

:a=v

Si ano es un número, le asignamos el valor v, lo que también nos dará un valor 0agregado a nuestro total en el primer pase.

t+

Finalmente, agregamos el resultado del ternario anterior a nuestro total acumulado.


Original, 156 bytes

a=>a.reduce((t,c)=>t+(p+1)*g(c)/2|0,p=(g=e=>+`123456234567456779223467`["LoUmOnEePaMoYaViOhFuDeZoVeEwKaIrBrGoKuRoDaNeRaSa".search(e[0]+e[1])/2])(a.shift()))

Puede guardar un byte más reutilizando un: 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 ^^)
Arnauld

Buen truco, gracias, @Arnauld. Tratando de llegar a un cálculo que me daría el número que estamos indexando en menos bytes en este momento, pero no tengo mucha suerte.
Shaggy

6

JavaScript, 212 210 207 206 bytes

Algoritmo de búsqueda directo, las cadenas de búsqueda solo contribuyen al total de bytes.

Código

s=>eval('p=q=+(e=s.map(r=>"1 2 3 4 5  6  2 3 4 5  6  7 4  5 6   7 7  9  2 2  3   4   6 7"["LoUmOnEePalMonYaViOhFulDesZoVenEwKathIrBroGorKuRosDainNetaRaSar".search(r)])).shift();e.map(c=>p+=((q+1)*c)>>1);p')

Formato de entrada

Conjunto de cadenas, cada elemento es una cadena con mayúscula de primera letra. Ejemplo: ["Mon", "Zo", "Ir", "Neta"]

Explicación

e=s.map(r=>"1 2 3 4 5  6  2 3 4 5  6  7 4  5 6   7 7  9  2 2  3   4   6 7"["LoUmOnEePalMonYaViOhFulDesZoVenEwKathIrBroGorKuRosDainNetaRaSar".search(r)])

Esto consulta los costos básicos.

p=q=+(/*blah*/).shift() 

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.

e.map(c=>p+=((q+1)*c)>>1);

Agrega los costos de las runas sin poder al poder base. Se usa desplazamiento en lugar de piso (bla) / 2.

eval(/*blah*/;p)

Evaluar el último resultado. (Crédito: Paso gallina)

Casos de prueba

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

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 ()


1
A menos que llame desde gadentro g, permitimos que las respuestas de JS eliminen el g=. Además, puede guardar un par de bytes cambiándolo a una evaluación y eliminando return: Fiddle
Stephen

@StepHen Gracias por la idea eval () y las reglas JS, ya que AS3 prohibió la evaluación () pensé que ya no podía usar eso
Shieru Asakoto

Bueno, todavía funciona, y definimos el lenguaje por la implementación: P
Stephen

1
searchte ahorrará unos bytes indexOf.
Shaggy

@Shaggy Funcionó, gracias por la idea de búsqueda;)
Shieru Asakoto


3

Python 2 , 320 318 314 311 307 bytes

Formato de entrada lista de cadenas. Programa completo:

i=input()
t=[x.split()for x in"Lo Um On Ee Pal Mon|Ya Vi Oh Ful Des Zo|Ven Ew Kath Ir Bro Gor|Ku Ros Dain Neta Ra Sar".split('|')]
c=t[0].index(i[0])+1;r=c+1;s=c+r*(t[1].index(i[1])+2)/2
if len(i)>2:s+=r*(t[2].index(i[2])+4-(i[2]=='Bro'))/2
if len(i)>3:s+=r*(t[3].index(i[3])+1+(i[3]in'KuRaSar'))/2
print(s)

Pruébalo en línea!


1
Dejé de jugar al golf, así que cualquiera que tenga ideas de golf puede editarlo en sí mismo .
Sr. Xcoder

3

Excel, 339 bytes

Entradas ingresadas a A1través de D1. Fórmula en cualquier otra celda.

=CHOOSE(MOD(CODE(A1),12),2,,,1,6,,3,5,4)+INT((CHOOSE(MOD(CODE(A1),12),2,,,1,6,,3,5,4)+1)*CHOOSE(MOD(CODE(B1),12),,3,,,2,7,4,6,,5)/2)+INT((CHOOSE(MOD(CODE(A1),12),2,,,1,6,,3,5,4)+1)*CHOOSE(MOD(CODE(C1),12),7,4,6,,,7,,,5,,9)/2)+INT((CHOOSE(MOD(CODE(A1),12),2,,,1,6,,3,5,4)+1)*CHOOSE(MOD(CODE(SUBSTITUTE(D1,"Ra","E")),11),4,3,6,,2,7,,,2,0)/2)

Alternativamente, importando como CSV:

Excel y CSV, 228 bytes

,,,
=CHOOSE(MOD(CODE(A1),12),2,,,1,6,,3,5,4)+1
=A2-1+INT(A2*CHOOSE(MOD(CODE(B1),12),,3,,,2,7,4,6,,5)/2)+INT(A2*CHOOSE(MOD(CODE(C1),12),7,4,6,,,7,,,5,,9)/2)+INT(A2*CHOOSE(MOD(CODE(SUBSTITUTE(D1,"Ra","E")),11),4,3,6,,2,7,,,2,0)/2)

Entrada ingresada en la primera fila, SPACEpara nulos. El resultado se muestra en A3.


2

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").

def n(i:Int,p:String):Int={Math.floor(i*((""+p(0)).toInt+1)/2).toInt}
def m(s:String):Int={var k=s.split(' ')

while(k.length<4)k:+=""

k match{case Array(p,i,f,a)=>{p match{case "Lo"=>1+m(1+"/ "+i+" "+f+" "+a)
case "Um"=>2+m(2+"/ "+i+" "+f+" "+a)
case "On"=>3+m(3+"/ "+i+" "+f+" "+a)
case "Ee"=>4+m(4+"/ "+i+" "+f+" "+a)
case "Pal"=>5+m(5+"/ "+i+" "+f+" "+a)
case "Mon"=>6+m(6+"/ "+i+" "+f+" "+a)
case _ if p.contains("/")=>i match{case "Ya"=>n(2,p)+m(p+" / "+f+" "+a)
case "Vi"=>n(3,p)+m(p+" / "+f+" "+a)
case "Oh"=>n(4,p)+m(p+" / "+f+" "+a)
case "Ful"=>n(5,p)+m(p+" / "+f+" "+a)
case "Des"=>n(6,p)+m(p+" / "+f+" "+a)
case "Zo"=>n(7,p)+m(p+" / "+f+" "+a)
case _ if p.contains("/")=>f match{case "Ven"=>n(4,p)+m(p+" / "+"/ "+a)
case "Ew"=>n(5,p)+m(p+" / "+"/ "+a)
case "Kath"=>n(6,p)+m(p+" / "+"/ "+a)
case "Ir"=>n(7,p)+m(p+" / "+"/ "+a)
case "Bro"=>n(7,p)+m(p+" / "+"/ "+a)
case "Gor"=>n(9,p)+m(p+" / "+"/ "+a)
case _ if p.contains("/")=>a match{case "Ku"=>n(2,p)
case "Ros"=>n(2,p)
case "Dain"=>n(3,p)
case "Neta"=>n(4,p)
case "Ra"=>n(6,p)
case "Sar"=>n(7,p)
case _=>0}
case _=>0}
case _=>0}
case _=>0}}}}

Gracias por este excelente desafío. Pruébalo en línea!


@Arnauld Acabo de notar algo sobre mi código: ¡realmente no comprueba si existe! Quiero decir, si ingreso "Lo Whoo Gor" ¡sale 5! ¿Está bien? ¿O debería arreglar esto?
V. Courtois

Eso está bien porque "las runas están garantizadas para ser válidas" (segunda regla).
Arnauld

Oh cierto :) Lo hice sin pensar, así que olvidé esta regla. Gracias de nuevo.
V. Courtois

2

Lenguaje de programación Shakespeare , 4420 bytes

,.Ajax,.Ford,.Page,.Puck,.Romeo,.Act I:.Scene I:.[Enter Romeo and Page]Page:You big big big big big big cat.[Exit Romeo][Enter Ajax]Page:Open thy mind!Ajax:Open thy mind!Open thy mind!You is the sum of Romeo and the sum of a big big cat and a cat.Am I as big as you?If not,let us return to Scene V.Page:You is the sum of a big big cat and a cat.Let us return to Act V.Scene V:.Ajax:You is the sum of you and the sum of a big big big cat and a pig.Am I as big as you?If not,let us return to Scene X.Page:You big cat.Let us return to Act V.Scene X:.Ajax:You is the sum of you and the sum of a big cat and a cat.Am I as big as you?If not,let us return to Scene L.Page:You big big cat.Let us return to Act V.Scene L:.Ajax:You is the sum of you and the sum of a big big cat and a big cat.Am I as big as you?If not,let us return to Scene C.Page:You is the sum of a big cat and a cat.Let us return to Act V.Scene C:.Ajax:Am I as big as the sum of you and a big big big pig?Page:You is the sum of a big big cat and a big cat.If so,you is the sum of you and a cat.Ajax:Open thy mind!Act V:.Scene I:.[Exit Ajax][Enter Ford]Page:Open thy mind!Ford:Open thy mind!Open thy mind!You is the sum of Romeo and the sum of a big big big big cat and a pig.Am I as big as you?If not,let us return to Scene V.Page:You big big cat.Let us return to Act X.Scene V:.Ford:You is the sum of you and the sum of a big big big cat and a pig.Am I as big as you?If not,let us return to Scene X.Page:You is the sum of a big cat and a cat.Let us return to Act X.Scene X:.Ford:You is the sum of you and a big big cat.Am I as big as you?If not,let us return to Scene L.Page:You is the sum of a big big big cat and a pig.Let us return to Act X.Scene L:.Ford:Am I as big as the sum of you and a pig?If not,let us return to Scene C.Page:You big cat.Let us return to Act X.Scene C:.Ford:Am I as big as the sum of Romeo and a big big cat?Page:You is the sum of a big big cat and a cat.If so,you is the sum of you and a cat.Ford:Open thy mind!Act X:.Scene I:.[Exit Page][Enter Puck]Ford:You is the sum of the sum of Ajax and a pig and the quotient between the product of Ajax and I and a big cat.Puck:Open thy mind!Is you as big as a pig?If so,let us return to Act D.[Exit Puck][Enter Page]Ford:Open thy mind!Open thy mind!You is the sum of Romeo and the sum of a big big cat and a cat.Am I as big as you?If not,let us return to Scene V.Page:You is the sum of a big big cat and a cat.Let us return to Act L.Scene V:.Ford:Am I as big as the sum of you and a big big cat?If not,let us return to Scene X.Page:You is the sum of a big big big cat and a pig.Let us return to Act L.Scene X:.Ford:Open thy mind!Am I as big as the sum of Romeo and a big cat?If not,let us return to Scene L.Page:You is the sum of a big big big cat and a pig.Let us return to Act L.Scene L:.Ford:You is the sum of Romeo and the sum of a big big big cat and a pig.Am I as big as you?If not,let us return to Scene C.Page:You is the sum of a big big big cat and a cat.Let us return to Act L.Scene C:.Ford:Am I as big as the sum of you and a big big cat?If so,let us return to Scene D.Page:You big big cat.Let us return to Act L.Scene D:.Page:Open thy mind!You is the sum of a big big cat and a big cat.Act L:.Scene I:.[Exit Page][Enter Puck]Ford:You is the sum of you and the quotient between the product of Ajax and I and a big cat.Puck:Open thy mind!Is you as big as a pig?If so,let us return to Act D.[Exit Puck][Enter Page]Ford:You is the sum of Romeo and a big big cat.Am I as big as you?If not,let us return to Scene V.Page:You is the sum of a big cat and a cat.Let us return to Act C.Scene V:.Ford:You is the sum of you and the sum of a big big big cat and a pig.Am I as big as you?If not,let us return to Scene X.Page:You big cat.Let us return to Act C.Scene X:.Ford:Am I as big as the sum of you and the sum of a big cat and a cat?If not,let us return to Scene L.Page:You big big cat.Let us return to Act C.Scene L:.Ford:Am I as big as the sum of you and a big big big cat?If not,let us return to Scene C.Page:You is the sum of a big big big cat and a pig.Let us return to Act C.Scene C:.Page:Open thy mind!Is you as big as the sum of Romeo and a cat?You big cat.If so,you is the sum of you and a big big cat.Act C:.Scene I:.[Exit Page][Enter Puck]Ford:You is the sum of you and the quotient between the product of Ajax and I and a big cat.Act D:.Scene I:.Ford:Open thy heart![Exeunt]

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!


1

Java (OpenJDK 8) , 252 bytes

r->{int c[][]={{2,3,4,5,6,7},{4,5,6,7,7,9},{2,2,3,4,6,7}},l=r.length,p="LUOEPM".indexOf(r[0].charAt(0))+1,a=p,i=0;String[]s={"YVOFDZ","VEKIBG","KRDNXS"};for(;i<l-1;)a+=(p+1)*c[i][s[i++].indexOf((l>3?r[i].replace("Ra","X"):r[i]).charAt(0))]/2;return a;}

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 Rosy Raexisten en el cuarto segmento. Lo traté con un reemplazo en línea y explícito de Rato X.


1

Retina , 124 123 bytes

Gor
9
[ZIBS]\w+
7
Mon|Des|Kath|Ra
6
..l|Ew
5
Ee|Oh|Ven|Neta
4
[OVD]\w+
3
[UYKR]\w+
2
Lo
1
\d
$*
(?<=^(1+) .*1)
$1
\G1
11
11

Prué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.


1

C, 274

#define c(p,r,x)(p+1)*b(r[x+1],x*17)/2
i;char*a="& ; $ # 4 %        ; B * 6 $ 8          6 5 - >3  +  A@( .   6 5    ";b(r,s)char*r;{for(i=0;i<17;i++)if(a[i+s]-3==(r[0]^r[1]))return i/2+1;return 0;}main(n,r)char**r;{n=b(r[1],0);printf("%d\n",n+c(n,r,1)+c(n,r,2)+c(n,r,3));}

Más no golfista:

#include<stdio.h>
char*a="& ; $ # 4 %      "
       "  ; B * 6 $ 8    "
       "      6 5 - >3  +"
       "  A@( .   6 5    ";
int b(char*r,int s){
  for(int i=0;i<17;i++)
    if(a[i+s]-3==(r[0]^r[1]))
      return i/2+1;
  return 0;
}
#define c(p,r,i)(p+1)*b(r[i+1],i*17)/2
int main(int n,char**r){
  int x=b(r[1],0);
  printf("%d\n",x+c(x,r,1)+c(x,r,2)+c(x,r,3));
}

Debe proporcionar cuatro argumentos de línea de comando, por lo que para el primer caso de prueba debe ejecutar ./a.out Lo Ful "" ""



1

Go, 205 bytes

func c(s []string)int{f,l:=strings.IndexByte,len(s)
p:=f("UOEPM",s[0][0])+3
r:=p-1+p*(f("VOFDZ",s[1][0])+3)/2
if l>2{r+=p*(f("war o",s[2][1])+5)/2}
if l>3{r+=p*(f("it Ra",s[3][len(s[3])-2])+3)/2}
return r}

Es una función invocable, toma runas como una porción de cadenas, por ejemplo []string{"Um", "Ful"}.

Pruébalo en Go Playground .


0

Haskell, 623 bytes

Usar ADT en lugar de vudú numérico.

NOTA: Agregue 36 para {-# LANGUAGE GADTs,ViewPatterns #-}

  • La puntuación se calcula asumiendo que se compila / ejecuta con -XGADTs -XViewPatterns
data P=Lo|Um|On|Ee|Pal|Mon deriving(Enum,Read,Eq)
data E=Ya|Vi|Oh|Ful|Des|Zo deriving(Enum,Read,Eq)
data F=Ven|Ew|Kath|Ir|Bro|Gor deriving(Enum,Read,Eq)
data C=Ku|Ros|Dain|Neta|Ra|Sar deriving(Enum,Read,Eq)
data S where
  S::P->E->S
  Q::P->E->F->S
  R::P->E->F->C->S
k(a:b:x)=let{p=read a;e=read b}in case x of{[]->S p e;[c]->Q p e(read c);[c,d]->R p e(read c)(read d)}
c,d::Enum a=>a->Int
c=succ.fromEnum
d=(+2).fromEnum
e Bro=7
e x=(+2).d$x
f x|c x`elem`[1,5,6]=d x|2>1=c x
g p f x =(`div`2).(*f x).succ$c p
h(S x y)=c x+g x d y
h(Q x y z)=h(S x y)+g x e z
h(R x y z t)=h(Q x y z)+g x f t
main=print.h.k.words=<<getLine

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

main=interact$unlines.map(show.h.k.words).lines

Pero esto agregaría bytes al recuento

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.