Edit : Je n'ai jamais joué à D&D auparavant, donc lorsque j'ai posé cette question au départ, je ne l'ai pas bien recherchée. Je m'en excuse, et je fais quelques modifications qui pourraient invalider les réponses pour rester aussi fidèles que possible aux règles du dnd 5e. Désolé.
Un fan de D&D d'une récente question de Hot Network semble avoir du mal à déterminer si les sorts choisis par un sorcier correspondent aux possibilités - et je pense que nous devrions aider!
introduction
(tout cela est déjà décrit dans la question précédente)
Un sorcier connaît deux sorts de niveau 1 depuis le début (niveau 1): [1, 1]
Chaque fois qu'un sorcier gagne un niveau (sauf pour les niveaux 12, 14, 16, 18, 19 et 20), il apprend un nouveau sort (obligatoire).
De plus, lorsque vous passez au niveau supérieur, vous pouvez choisir (facultatif) de remplacer l' un des sorts par un autre.
Les sorts appris et remplacés doivent être un niveau d'emplacement de sort valide qui correspond à la moitié du niveau de votre sorcier arrondi. Voir ce tableau:
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
Cela signifie qu'au niveau 3, on peut avoir les niveaux de sort [1, 1, 2, 2]
comme ceci:
Level 1: [1, 1] (initial)
Level 2: [1, 1, 1 (new)]
Level 3: [1, 1, 2 (replaced), 2 (new)]
Il n'est pas nécessaire de choisir les sorts de plus haut niveau auxquels vous avez accès.
Les niveaux des sorts [1, 1, 1, 1]
sont parfaitement valables pour un niveau 3.
Enfin, n'oubliez pas que le remplacement d'un sort est une option facultative pour chaque niveau . Cela signifie que certains niveaux peuvent ignorer le remplacement, tandis que d'autres s'en servent.
Le défi
Créez un programme ou une fonction qui prend un entier (niveau) compris entre 1 et 20.
Il doit également prendre un tableau d'entiers (niveaux de sort) avec des valeurs allant de 1 à 9 dans n'importe quel ordre (9 est le niveau de sort maximum).
La sortie du programme doit être une valeur de vérité / fausse validant si les niveaux de sort choisis sont valables pour un sorcier du niveau donné.
Cas de test
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]
C'est le golf de code - le moins d'octets gagne!
la source
[2,2,3,3]
ne seraient pas possibles car ils nécessitent plus de remplacement qu'un sorcier de ce niveau n'aurait accès." - le fait que la liste soit de longueur 4 plutôt que 5 n'est-il pas une raison plus fondamentale ici? (Je suppose que[1,3,2,2,3]
c'est possible pour un niveau 4 en passant du niveau 3[1,1,2(replaced),2(new)]
à[1,3(replaced),2,2,3(new)]
?)Réponses:
Java (JDK 10) , 191 octets
Essayez-le en ligne!
Explications
Tableau 1: Distribution maximisée des sorts pour chaque niveau de sorcier, utilisée à partir de la réponse d' Axoren à la question liée .
Crédits
la source
return l<1&java.util.Arrays.equals(m,new int[9]);
peut être à laz=0;for(int i:m)z+=i;return l+z==0;
place. Ou si les valeurs dem
ne peuvent jamais être négatives à la fin, cela==0
peut l'être<1
.for(int i:m)l|=i;
c'est encore plus intelligent! Joli.new int[]{5,6,6,6,7,7,7,8,8,8,9,9,9,9,9}
). Si je les saisis par ordre décroissant (new int[]{9,9,9,9,9,8,8,8,7,7,7,6,6,6,5}
comme écrit dans l'exigence d'entrée que j'ai écrite sous le golf), cela fonctionne. J'ai ajouté le cas de test pour montrer qu'il fonctionne bien.Python 3 , 98 octets
Essayez-le en ligne!
Non golfé:
edit: solution corrigée pour utiliser les règles D&D correctes
la source
print(v(20, [6,6,6,6,7,7,7,8,8,8,9,9,9,9,9])) # False
impressions sont vraies. Il devrait afficher faux.min(9,n-1)
celle.Fusain , 51 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Prend les niveaux des sorts en ordre croissant sous forme de chaîne. Explication:
Saisissez le niveau.
Effectuez un décodage de longueur d'exécution sur la chaîne
0544443335
résultant en la chaîne11111222233334444555566677788899999
. Cette chaîne est ensuite tranchée en commençant au niveau (1-indexé) et se terminant au niveau doublé (si moins de 12) ou 6 + 1,5 *, arrondi vers le haut, sauf pour le niveau 19, qui est arrondi vers le bas. A0
est suffixé pour s'assurer qu'il n'y a pas trop de sorts.Comparez les niveaux des sorts avec la sous-chaîne et affiche a
-
si aucun d'entre eux n'est excessif.la source
11113
au niveau4
qui est le résultat d'aucune mise1
à niveau optionnelle, prenant au niveau 2,1
au niveau 3 et3
, au niveau 4.JavaScript (ES6), 79 octets
(level)(array)
Essayez-le en ligne!
Code de test
Vous trouverez ci-dessous un lien vers un code de test qui prend le niveau du sorcier en entrée et renvoie un tableau de niveaux de sort maximum, en utilisant la même logique que la fonction ci-dessus.
Essayez-le en ligne!
Comment?
Table de référence
Nombre de sorts
Niveaux de sort maximum
la source
Groovy , 155 octets
Génère le meilleur grimoire possible, puis vérifie que le grimoire passé dans la méthode n'est pas meilleur.
Non golfé, avec des types implicites rendus explicites:
Essayez-le en ligne!
la source