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.
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:
- Potência (obrigatória)
- Influência Elementar (obrigatório)
- Formulário (opcional)
- 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:
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 é código-golfe , 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
fonte
Respostas:
SOGL V0.12 ,
11078 bytesExperimente aqui!
Provavelmente poderia jogar um byte ou dois por refazer tudo
Explicação:
fonte
Python 2 ,
135119115 bytesExperimente online!
Input é uma lista de strings de stdin
fonte
05AB1E ,
8382 bytesExperimente online!
-1 graças a Emigna .
SOOOOOOO ungolfed :(
Explicação:
fonte
.•Y<εΔ•
no início, não precisará incrementar o índice.JavaScript (ES6),
1571561161121009997 bytesRecebe entrada como uma matriz de seqüências de caracteres.
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 ...
Uma função anônima que toma a matriz como argumento via parâmetro
a
.Reduza os elementos na matriz passando cada um por uma função; o
t
parâmetro é o total em execução, oc
parâmetro é a cadeia atual e0
o valor inicial det
.Converta o elemento atual de uma sequência base 36 em um número inteiro decimal.
Execute algumas operações de módulo nele.
Pegue o caractere da string nesse índice e converta-o em um número.
Atribua esse número à variável
v
.Verifique se a variável
a
é um número. Para o primeiro elementoa
será a matriz de strings, tentando converter isso em um número retornaráNaN
, o que é falsey. Em cada passo subsequente,a
haverá um número inteiro positivo, que é verdadeiro.Se
a
for um número, multiplicamos pelo valor dev
, adicionamos o valor dev
e 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.Se
a
não for um número, atribuímos o valorv
a ele, o que também nos dará0
a soma ao total na primeira passagem.Finalmente, adicionamos o resultado do ternário acima ao nosso total corrente.
Original, 156 bytes
fonte
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 ^^)JavaScript,
212210207206 bytesAlgoritmo de pesquisa direta, as seqüências de pesquisa estão apenas contribuindo para o total de bytes.
Código
Formato de entrada
Array de string, cada item é uma string em maiúscula na primeira letra. Exemplo: ["Seg", "Zo", "Ir", "Neta"]
Explicação
Isso consulta os custos básicos.
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.
Adiciona os custos das runas sem energia à energia base. O deslocamento é usado em vez do piso (blá) / 2.
Avalie o último resultado. (Crédito: Step Hen)
Casos de teste
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 ()
fonte
g
dentrog
, permitimos que as respostas do JS removam og=
. Além disso, você pode salvar um par de bytes por ligá-lo a um eval e remover oreturn
: Fiddlesearch
você economizará alguns bytesindexOf
.Haskell ,
159156148 148133130127 bytesExperimente online!
fonte
Python 2 ,
320 318 314 311307 bytesFormato de entrada - lista de strings. Programa completo:
Experimente online!
fonte
Excel, 339 bytes
Entradas inseridas
A1
atéD1
. Fórmula em qualquer outra célula.Como alternativa, importando como CSV:
Excel e CSV, 228 bytes
Entrada inserida na primeira linha,
SPACE
para nulos. Resultado exibido em A3.fonte
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").while(k.length<4)k:+=""
Obrigado por este excelente desafio. Experimente online!
fonte
Linguagem de programação de Shakespeare , 4420 bytes
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!
fonte
Java (OpenJDK 8) , 252 bytes
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
Ros
eRa
existe no 4º segmento. Tratei isso com uma substituição inline e explícita deRa
paraX
.fonte
Retina ,
124123 bytesExperimente 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.
fonte
C, 274
Mais ungolfed:
Você precisa fornecer quatro argumentos de linha de comando - portanto, para o primeiro caso de teste, é necessário executar
./a.out Lo Ful "" ""
fonte
Vá, 205 bytes
É uma função que pode ser chamada, usa runas como uma fatia de strings, por exemplo
[]string{"Um", "Ful"}
.Experimente no Go Playground .
fonte
Haskell, 623 bytes
Usando ADTs em vez de vodu numérico.
NOTA: Adicione 36 para
{-# LANGUAGE GADTs,ViewPatterns #-}
-XGADTs -XViewPatterns
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
Mas isso adicionaria bytes à contagem
fonte