Contexte
Une source d'ennui dans les jeux de rôle sur table est le traitement des jets impliquant de nombreux dés. Lancer un sort de Désintégration peut être instantané, mais lancer et additionner 40 dés ne l'est certainement pas!
Un certain nombre de suggestions pour gérer cela sont discutées sur rpg.stackexchange.com . Cependant, certains d'entre eux, comme l'utilisation d'un programme à rouleaux ou la moyenne des dés, enlèvent un peu de plaisir et de contrôle aux joueurs. D'autres, comme lancer 4 dés et multiplier le total par 10, rendent les résultats beaucoup plus dynamiques (tandis que la moyenne des dés agit dans la direction opposée).
Cette question concerne une méthode pour réduire le nombre de lancers de dés sans changer ni le résultat moyen (moyenne) ni son swinginess (variance).
Notation et mathématiques
Dans cette question, nous utiliserons la notation suivante pour représenter les lancers de dés:
- n d k (par exemple 40d6) fait référence à la somme de n rouleaux d'un dé à faces k.
- n d k * c (par exemple 4d6 * 10) décrit la multiplication du résultat par une constante c.
- Nous pouvons également ajouter des rouleaux (par exemple 4d6 * 10 + 40d6) et des constantes (par exemple 4d6 + 10).
Pour un seul jet de dé, nous pouvons montrer que:
- Moyenne : E [1d k ] = (k + 1) / 2
- Variance : Var (1d k ) = (k-1) (k + 1) / 12
En utilisant les propriétés de base de la moyenne et de la variance, nous pouvons en outre déduire que:
- Moyenne : E [ m d k * a + n d l * b + c ] = am .E [1d k ] + bn . [1d l ] + c
- Variance : Var ( m d k * a + n d l * b + c ] = a ². M .Var (1d k ) + b ². N .Var (1d l )
Tâche
Étant donné trois entiers n , k et r , votre programme devrait produire un moyen d'approximer n d k dans au plus r rouleaux, avec les contraintes suivantes:
- La solution doit avoir la même moyenne et la même variance que n d k .
- La solution doit contenir le plus grand nombre possible de rouleaux inférieur ou égal à r , car plus de rouleaux produisent une distribution plus fluide.
- Vous devez limiter vos solutions à l'utilisation uniquement de dés à faces k , sauf si vous visez le bonus (voir ci-dessous).
- S'il n'y a pas de solution (car r est trop petit), le programme devrait sortir la chaîne "JE SUIS UN DIEU DE GUERRE SEXY SHOELESS!".
- Les paramètres sont transmis sous la forme d'une chaîne unique séparée par des espaces.
- Vous pouvez supposer que 1 ≤ n ≤ 100, 1 ≤ r ≤ n et que k est l'un de 4, 6, 8, 10, 12 et 20 (les dés standard utilisés sur les dessus de table).
- La sortie doit être au format décrit dans Notation (par exemple 4d6 * 10 + 5), avec des espaces optionnels autour de + s mais nulle part ailleurs. Les multiplicateurs d'unités sont également facultatifs: les 4d6 * 1 et 4d6 sont valides.
Vous pouvez écrire un programme ou une fonction, en prenant des entrées via STDIN (ou l'alternative la plus proche), un argument de ligne de commande ou un argument de fonction. Les résultats doivent être imprimés dans STDOUT (ou l'alternative la plus proche) ou renvoyés sous forme de chaîne.
Exemples
>> "10 6 10"
10d6
>> "10 6 4"
2d6*2+2d6+14
>> "10 6 3"
1d6*3+1d6+21
>> "10 6 2"
1d6*3+1d6+21
>> "10 6 1"
I AM A SEXY SHOELESS GOD OF WAR!
Notation
Le code le plus court gagne. Des règles standard s'appliquent.
Prime
-33% (arrondi avant la soustraction) si votre programme renvoie également des solutions qui incluent des dés valides autres que k (où les valeurs valides, comme mentionné ci-dessus, sont 4, 6, 8, 10, 12 et 20). Si vous choisissez de le faire, vous devez toujours renvoyer ces solutions le cas échéant et gérer les solutions qui utilisent plusieurs types de matrices. Exemple:
>> "7 4 3"
3d6+7