Quanta Mana eu preciso?

33

O Dungeon Master foi um dos primeiros RPGs em tempo real, lançado originalmente em 1987 no Atari ST. Entre outras coisas interessantes para a época, ele ofereceu um sistema de feitiços bastante sofisticado, baseado em runas.

Sua tarefa hoje é escrever um programa ou função que avalie o número de pontos de Mana necessários para lançar um determinado feitiço no Dungeon Master.

Captura de tela do Dungeon Master

O sistema 'spell cast' é a caixa ciana superior direita na figura acima.

Feitiços, runas e Mana

As magias do Dungeon Master são compostas por 2 a 4 runas, escolhidas entre as seguintes categorias, nesta ordem exata:

  1. Potência (obrigatória)
  2. Influência Elementar (obrigatório)
  3. Formulário (opcional)
  4. Classe / Alinhamento (opcional)

Isso significa que feitiços válidos são:

  • Poder + Influência Elementar
  • Poder + Influência Elementar + Forma
  • Poder + Influência Elementar + Forma + Classe / Alinhamento

Cada categoria contém 6 runas e cada runa tem um custo de Mana base associado:

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

Avaliando o custo de Mana

O custo de Mana do feitiço é a soma do custo de Mana de todas as runas:

  • O custo da runa Power sempre é igual ao custo base (de 1 a 6).

  • Para as outras runas, a seguinte fórmula se aplica:

    custo = piso ((potência + 1) * custo_ base / 2)

    onde energia é o custo base da runa de energia.

Exemplos

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

Esclarecimentos e regras

  • Sua entrada será composta de 2 a 4 cordas, designando as runas do feitiço. Você pode levá-los em qualquer formato razoável, como 4 parâmetros distintos, uma matriz de strings (por exemplo ['Lo', 'Ful']) ou apenas uma string com um separador de caractere único de sua escolha (por exemplo 'Lo Ful'). Especifique o formato de entrada selecionado em sua resposta.
  • As runas são garantidas como válidas.
  • A ordem das categorias deve ser respeitada. As categorias não usadas podem estar ausentes ou substituídas por algum valor falso.
  • Você pode aceitar as runas em qualquer um destes formatos: 1. Uma letra maiúscula seguida por minúscula ( 'Ful') 2. Todas minúsculas ( 'ful') 3. Todas maiúsculas ( 'FUL'). Mas você não pode misturar formatos diferentes.
  • Obviamente, não queremos saber se o feitiço realmente tem algum efeito no jogo (pois os feitiços úteis e curiosos estão listados aqui ).
  • Isso é , então o código mais curto em bytes vence.
  • E lembre-se: Lord Chaos está observando você!

Casos de teste

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
Arnauld
fonte
1
Tangencial - mas para pessoas que gostam desse sistema, The Magical Land of Wozz é um jogo japonês do SNES (tradução em inglês disponível) que implementa quase o mesmo sistema - onde qualquer sequência de letras se torna um feitiço. google.co.jp/webhp?ie=UTF-8#q=magical+land+of+wozz
Coty Johnathan Saxman
Eu tenho uma vaga lembrança de ver alguém jogar Dungeon Master (eu não acho que foi no ST). Eles equiparam um de seus combatentes com um colar mágico e, de vez em quando, checavam se ele havia recarregado e, se assim eram, lançavam outra runa do que eu acho que era um feitiço que produzia algum tipo de luz, para que o lutador pudesse lançar esse feitiço a cada dez minutos, mais ou menos, e eventualmente ganhou um nível de magia.
Neil
@ Neil Este colar era provavelmente a Pedra da Lua (+3 de Mana) ou o Pingente Feral (+1 de Habilidade de Arcanista). Todos os itens estão listados aqui .
precisa
Este script deve saída todas as combinações possíveis de entrada
NieDzejkob

Respostas:

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*»+

Experimente aqui!

Provavelmente poderia jogar um byte ou dois por refazer tudo

Explicação:

θ            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
dzaima
fonte
2
Isso é o que o tornam ainda mais interessante
Walfrat
Você pode adicionar uma explicação?
CalculatorFeline
@CalculatorFeline Esqueceu-se desta resposta. Provavelmente de golfe e em seguida, adicione uma explicação
dzaima
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:])

Experimente online!

Input é uma lista de strings de stdin

ovs
fonte
Outgolfed ...> <.
Mr. Xcoder
Também copiei o método de entrada do TIO para a minha resposta, espero que você não se importe.
Mr. Xcoder
@ Mr.Xcoder Agora incluí todos os casos de teste. Você pode copiá-los se quiser
ovs 29/06
Oo, bem feito na indexação - se eu emprestar para minha solução 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*;(î(+

Experimente online!

-1 graças a Emigna .

SOOOOOOO ungolfed :(

Explicação:

.•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
Erik, o Outgolfer
fonte
Um pequeno golfe seria que, se você indexar .•Y<εΔ•no início, não precisará incrementar o índice.
Emigna
@Emigna Ooh não teve tempo para tentar que ainda ...
Erik o Outgolfer
11

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

Recebe entrada como uma matriz de seqüências de caracteres.

a=>a.map(c=>t+=(v=+`27169735020045670435262`[parseInt(c,36)%141%83%50%23],+a?a*v+v>>1:a=v),t=0)|t
  • Salvei 44 bytes maciços emprestando o truque de indexação da solução Python da ovs - se você estiver votando esta resposta, faça um voto positivo também.
  • Economizou 13 bytes graças a Arnauld, apontando o que deveria ter sido uma oportunidade óbvia de usar um ternário.

Experimente Online!


Explicação

Hoo, garoto, isso vai ser divertido - minhas explicações para soluções triviais são péssimas na melhor das hipóteses! Vamos tentar ...

a=>

Uma função anônima que toma a matriz como argumento via parâmetro a.

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

Reduza os elementos na matriz passando cada um por uma função; o tparâmetro é o total em execução, o cparâmetro é a cadeia atual e 0o valor inicial de t.

parseInt(c,36)

Converta o elemento atual de uma sequência base 36 em um número inteiro decimal.

%141%83%50%23

Execute algumas operações de módulo nele.

+`27169735 2  4567 435262`[]

Pegue o caractere da string nesse índice e converta-o em um número.

v=

Atribua esse número à variável v.

+a?

Verifique se a variável aé um número. Para o primeiro elemento aserá a matriz de strings, tentando converter isso em um número retornará NaN, o que é falsey. Em cada passo subsequente, ahaverá um número inteiro positivo, que é verdadeiro.

a*v+v>>1

Se afor um número, multiplicamos pelo valor de v, adicionamos o valor de ve deslocamos os bits do resultado 1 bit para a direita, o que resulta no mesmo resultado que a divisão por 2 e o piso.

:a=v

Se anão for um número, atribuímos o valor va ele, o que também nos dará 0a soma ao total na primeira passagem.

t+

Finalmente, adicionamos o resultado do ternário acima ao nosso total corrente.


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()))
Shaggy
fonte
Você pode salvar mais um byte, reutilizando a: a=>a.reduce((t,c)=>t+(v=+'27169735020045670435262'[parseInt(c,36)%141%83%50%23],+a?a*v+v>>1:a=v),0)(EDIT: removido um comentário irrelevante sobre inteiros passados na entrada - parece que eu não entendia o meu próprio desafio muito bem ^^)
Arnauld
Bom truque, obrigado, @Arnauld. Tentando chegar a um cálculo que me desse o número que estamos indexando em menos bytes no momento, mas sem muita sorte.
Shaggy
6

JavaScript, 212 210 207 206 bytes

Algoritmo de pesquisa direta, as seqüências de pesquisa estão apenas contribuindo para o 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

Array de string, cada item é uma string em maiúscula na primeira letra. Exemplo: ["Seg", "Zo", "Ir", "Neta"]

Explicação

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

Isso consulta os custos básicos.

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

Inicializa 2 variáveis ​​com o primeiro item do resultado da matriz acima e remova esse item. Deve ser convertido em número primeiro, caso contrário, será considerado como concatenação de strings na próxima parte.

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

Adiciona os custos das runas sem energia à energia base. O deslocamento é usado em vez do piso (blá) / 2.

eval(/*blah*/;p)

Avalie o último resultado. (Crédito: Step Hen)

Casos de teste

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

Edit 1: 212> 210 - Removido um par de chaves

Edit 2: 210> 207 - Obrigado, Step Hen, pelo lembrete das regras JS e por algumas dicas sobre o uso da função eval (). Como o AS3 proíbe o uso de eval (), eu não uso isso há muito tempo

Edit 3: 207> 206 - Obrigado Shaggy pela ideia de substituir indexOf () por search ()

Shieru Asakoto
fonte
1
A menos que você ligue para gdentro g, permitimos que as respostas do JS removam o g=. Além disso, você pode salvar um par de bytes por ligá-lo a um eval e remover o return: Fiddle
Stephen
@StepHen Obrigado pela as regras JS ideia eval () e, desde AS3 proibiu o eval () Eu pensei que eu não posso usar mais isso
Shieru Asakoto
Bem, ele ainda funciona, e nós definimos o idioma pela implementação: P
Stephen
1
searchvocê economizará alguns bytes indexOf.
Shaggy
@Shaggy Funcionou, obrigado pela idéia de pesquisa;) #
Shieru Asakoto 29/17 /
3

Haskell , 159 156 148 148 133 130 127 bytes

k(p:y)=sum$floor<$>c p:map(\x->c x*(c p+1)/2)y
c s=read["3764529516342767"!!(foldl(\c n->c*94+fromEnum n-9)0s%7086%17)]
(%)=mod

Experimente online!

bartavelle
fonte
3

Python 2 , 320 318 314 311 307 bytes

Formato de entrada - lista de strings. 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)

Experimente online!

Mr. Xcoder
fonte
1
Eu meio que desisti de jogar isso, então qualquer pessoa que tenha idéias de golfe pode editar por conta própria .
Mr. Xcoder
3

Excel, 339 bytes

Entradas inseridas A1até D1. Fórmula em qualquer outra célula.

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

Como alternativa, importando como CSV:

Excel e 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 inserida na primeira linha, SPACEpara nulos. Resultado exibido em A3.

Wernisch
fonte
2

SCALA, 1106 caracteres, 1106 bytes

Isso é bastante longo, provavelmente otimizável, mas foi divertido de fazer :)

Formato de entrada : runas separadas por espaço em uma sequência. Se houver apenas 2 entradas (como "Lo Ful"), meu código será completado com while(k.length<4)k:+=""(para que eu possa salvar 24 bytes alterando os parâmetros, se eu precisar que seja "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}}}}

Obrigado por este excelente desafio. Experimente online!

V. Courtois
fonte
@ Arnauld Acabei de notar algo sobre o meu código: ele realmente não verifica se a coisa existe! Quero dizer, se eu digitar "Lo Whoo Gor", ele gera 5! Está tudo bem? Ou devo corrigir isso?
V. Courtois
Tudo bem, porque as "runas são garantidas como válidas" (segunda regra).
precisa
Oh verdade :) Eu fiz isso sem pensar, então eu esqueci essa regra. Obrigado novamente.
V. Courtois
2

Linguagem de programação de 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]

Recebe a entrada como uma sequência maiúscula.

Explicação em breve ... Por enquanto, Curiosidade: Microsoft é um substantivo negativo no SPL. Todas as outras palavras aceitas apareceram nas obras de Shakespeare.

Experimente online!

NieDzejkob
fonte
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;}

Experimente online!

As runas são inseridas como uma String[](matriz deString ), na forma de primeiro caso (a primeira letra é maiúscula, o restante é minúsculo).

É o método padrão "encontre a n-ésima letra", com a torção que existe Rose Raexiste no 4º segmento. Tratei isso com uma substituição inline e explícita de Rapara X.

Olivier Grégoire
fonte
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

Experimente online! O link inclui casos de teste. Toma runas separadas por espaço. Explicação: Os estágios iniciais simplesmente convertem cada runa em um dígito, que é convertido em unário. Os números após o primeiro são multiplicados por um a mais que o primeiro número, após o qual o primeiro número é dobrado. O inteiro do estágio final divide todo o resultado por 2 e leva a soma.

Neil
fonte
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));}

Mais ungolfed:

#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));
}

Você precisa fornecer quatro argumentos de linha de comando - portanto, para o primeiro caso de teste, é necessário executar ./a.out Lo Ful "" ""

Jerry Jeremiah
fonte
255 bytes
ceilingcat
1

Vá, 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}

É uma função que pode ser chamada, usa runas como uma fatia de strings, por exemplo []string{"Um", "Ful"}.

Experimente no Go Playground .

icza
fonte
0

Haskell, 623 bytes

Usando ADTs em vez de vodu numérico.

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

  • A pontuação é calculada assumindo que é compilada / executada com -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: um único feitiço como uma sequência normal, por exemplo

Lo Ful

Um Ful

A multilinha pode ser feita substituindo a última linha por

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

Mas isso adicionaria bytes à contagem

archaephyrryx
fonte