Edit : Eu não joguei D&D antes, então, quando fiz essa pergunta inicialmente, não a pesquisei adequadamente. Peço desculpas por isso e estou fazendo algumas edições que podem invalidar as respostas para permanecer o mais fiel possível às regras do dnd 5e. Desculpa.
Um fã de D&D de uma pergunta recente da Hot Network parece ter algum problema para descobrir se os feitiços escolhidos por um feiticeiro estão alinhados com as possibilidades - e acho que devemos ajudar!
Introdução
(tudo isso já está descrito na pergunta mencionada anteriormente)
Um feiticeiro conhece duas magias de nível 1 desde o início (nível 1): [1, 1]
Toda vez que um feiticeiro ganha um nível (exceto os níveis 12, 14, 16, 18, 19 e 20), ele aprende um novo feitiço (obrigatório).
Além disso, ao subir de nível, um pode escolher (opcional) substituir um dos feitiços por outro.
Os feitiços aprendidos e substituídos devem ter um nível válido de slot de feitiço, que é metade do nível do seu feiticeiro arredondado para cima. Veja esta tabela:
Sorcerer level Highest spell level possible
1 1
2 1
3 2
4 2
5 3
6 3
7 4
8 4
9 5
10 5
11 6
12 6
13 7
14 7
15 8
16 8
17 9
18 9
19 9
20 9
Isso significa que no nível 3 é possível ter os níveis de feitiço [1, 1, 2, 2]
assim:
Level 1: [1, 1] (initial)
Level 2: [1, 1, 1 (new)]
Level 3: [1, 1, 2 (replaced), 2 (new)]
Não é necessário escolher os feitiços de nível mais alto aos quais você tem acesso.
Os níveis de feitiço [1, 1, 1, 1]
são perfeitamente válidos para um nível 3.
Por fim, lembre-se de que substituir um feitiço é uma opção opcional para todos os níveis . Isso significa que alguns níveis podem pular a substituição, enquanto outros fazem uso dela.
O desafio
Crie um programa ou função que utilize um número inteiro (nível) entre 1 e 20.
Também deve levar uma matriz de números inteiros (níveis de feitiço) com valores que variam de 1 a 9 em qualquer ordem (9 é o nível máximo de feitiço).
A saída do programa deve ser um valor de verdade / falsidade, validando se os níveis de feitiço escolhidos são válidos para um feiticeiro do nível especificado.
Casos de teste
Level: 1
Spells: [1, 1]
Output: true
Level: 8
Spells: [1, 1, 2, 3, 3, 5]
Ouput: false
Reason: A level 8 can't ever have access to a level 5 spell.
Level: 5
Spells: [1, 1, 1, 2, 2, 2, 3]
Output: false
Reason: A level 5 can't have access to 7 spells
Level: 11
Spells: [3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6]
Output: false
Reason: Too many spell upgrades.
The highest valid selection for level 11 is
[3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6]
Isso é código-golfe - o menor número de bytes vence!
fonte
[2,2,3,3]
não seriam possíveis, pois requer mais substituição do que um feiticeiro desse nível teria acesso." - não é o fato de a lista ter o tamanho 4 e não 5, uma razão mais fundamental aqui? (Suponho que[1,3,2,2,3]
é possível para um nível 4, indo do nível 3[1,1,2(replaced),2(new)]
para[1,3(replaced),2,2,3(new)]
?)Respostas:
Java (JDK 10) , 191 bytes
Experimente online!
Explicações
Tabela 1: Distribuição maximizada de feitiços para cada nível de feiticeiro, usada na resposta de Axoren na pergunta vinculada .
Créditos
fonte
return l<1&java.util.Arrays.equals(m,new int[9]);
pode ser emz=0;for(int i:m)z+=i;return l+z==0;
vez disso. Ou se os valores emm
nunca puderem ser negativos no final, eles==0
podem ser<1
.for(int i:m)l|=i;
é ainda mais esperto! Agradável.new int[]{5,6,6,6,7,7,7,8,8,8,9,9,9,9,9}
). Se eu inseri-los em ordem decrescente (new int[]{9,9,9,9,9,8,8,8,7,7,7,6,6,6,5}
conforme descrito no requisito de entrada que escrevi abaixo do golfe), funcionará. Eu adicionei o caso de teste para mostrar que realmente funciona.Python 3 , 98 bytes
Experimente Online!
Ungolfed:
edit: solução corrigida para usar regras corretas de D&D
fonte
print(v(20, [6,6,6,6,7,7,7,8,8,8,9,9,9,9,9])) # False
verdadeiro. Deve imprimir falso.min(9,n-1)
.Carvão , 51 bytes
Experimente online! Link é a versão detalhada do código. Toma níveis de feitiço em ordem crescente como uma corda. Explicação:
Insira o nível.
Execute a decodificação de comprimento de execução na sequência,
0544443335
resultando na sequência11111222233334444555566677788899999
. Essa sequência é cortada, começando no nível (indexado 1) e terminando no nível dobrado (se menor que 12) ou 6 + 1,5 *, arredondado para cima, exceto para o nível 19, que é arredondado para baixo. A0
é um sufixo para garantir que não haja muitos feitiços.Compare os níveis de ortografia com a substring e imprima a
-
se nenhum deles for excessivo.fonte
11113
ao nível4
que é o resultado de há atualizações opcionais, tendo1
no nível 2,1
nível 3 e3
, a nível 4.JavaScript (ES6), 79 bytes
(level)(array)
Experimente online!
Código de teste
Abaixo está um link para algum código de teste que leva o nível do feiticeiro como entrada e retorna uma matriz de níveis máximos de feitiço, usando a mesma lógica da função acima.
Experimente online!
Como?
Tabela de referência
Número de feitiços
Níveis máximos de feitiço
fonte
Groovy , 155 bytes
Gera o melhor livro de feitiços possível e depois verifica se o livro de feitiços passado para o método não é melhor.
Sem golfinhos, com tipos implícitos explicitados:
Experimente online!
fonte