Vous avez besoin d'une fonction, mais pas de boucles :)
Comme Someone_Evil note correctement la façon d'effectuer une inspection et une manipulation non triviale des résultats d'un jet de dés dans AnyDice est de passer ce jet dans une fonction qui attend une séquence (c'est-à-dire un paramètre étiqueté avec le symbole :s
). Lorsque vous faites cela, ce que AnyDice fait est d'appeler la fonction pour chaque résultat possible (trié) du rouleau et rassemble les résultats, pondérés par leur probabilité, dans un nouveau dé personnalisé.
À quoi doit ressembler votre fonction ? Quelque chose comme comme ceci (modulo une mauvaise lecture de la question ; voir la correction ci-dessous), par exemple :
function: test ROLL:s {
if !(ROLL = 1) { result: 1@ROLL }
result: [highest of d4 and 2@ROLL]
}
output [test 3d4]
OK, déballons un peu ça.
Tout d'abord, ROLL = 1
compare un nombre (1) avec une séquence ( ROLL
), renvoyant le nombre de valeurs de la séquence qui correspondent. Normalement, un if
dans AnyDice traite 0 comme faux et tout ce qui est différent de zéro comme vrai, mais l'instruction !
annule cela, en transformant 0 en 1 et tout le reste en 0. Donc if !(ROLL = 1)
exécute le bloc suivant uniquement si ROLL
ne contient aucune personne.
À l'intérieur du bloc, nous retournons simplement le premier élément de la séquence ROLL
. Nous savons que la séquence est triée par ordre décroissant (car c'est ce que fait AnyDice lorsque vous convertissez un dé en une séquence dans un appel de fonction), donc le premier élément est le plus élevé. Notez qu'AnyDice arrêtera l'exécution de la fonction dès qu'il verra une valeur result:
donc la deuxième ligne de code de la fonction ne sera pas exécutée dans ce cas.
Si ROLL
comprend certains d'entre eux, cependant, le !(ROLL = 1)
sera fausse et le bloc suivant ne sera pas exécuté, donc AnyDice continue sur la deuxième ligne. Dans ce cas, nous retournons la plus haute valeur de d4
y 2@ROLL
qui est la deuxième valeur la plus élevée obtenue à l'origine.
Pourquoi ceux-là ? Eh bien, imaginez ce que vous feriez en lançant les dés à la main. Vous les lancez d'abord tous, puis vous constatez que vous avez effectivement obtenu un 1. Maintenant, vous pouvez en toute sécurité mettre de côté tous les dés, sauf les deux plus élevés. car ils ne peuvent jamais être le résultat final. Ensuite, vous relancez le plus élevé des deux dés restants, et vous prenez le plus élevé des deux suivants.
Et c'est ce que fait le code.
(BTW, vous vous demandez peut-être ce qui se passe si vous appelez la fonction ci-dessus avec 1d4
de sorte que ROLL
n'a qu'un seul élément. En fait, cela fonctionne toujours, mais seulement par une petite coïncidence. Ce qui se passe dans ce cas est que 2@ROLL
évalue à 0, puisque c'est ce qu'AnyDice vous donne si vous demandez un élément au-delà de la fin d'une séquence. Et comme d4
est toujours supérieur à 0, la fonction finit par relancer le dé unique s'il est à l'origine un 1).
Correction : En écrivant la réponse ci-dessus, j'ai complètement oublié la dernière partie de la phrase "le dé le plus élevé est relancé". si c'est un 3 ou un 4 "Le code ci-dessus ne l'applique donc pas. Nous pouvons fixez-le facilement, cependant :
function: test ROLL:s {
if !(ROLL = 1 & 1@ROLL = {3,4}) { result: 1@ROLL }
result: [highest of d4 and 2@ROLL]
}
Cette version exécute le { result: 1@ROLL }
à moins que le rouleau ne contienne des uns et le premier chiffre (c'est-à-dire le plus élevé) du rouleau est 3 ou 4.
( 1@ROLL = {3,4}
est une traduction assez littérale de la règle "c'est un 3 ou un 4". Bien sûr, nous aurions pu l'écrire de manière euivalente, par exemple sous la forme suivante 1@ROLL >= 3
ou même - depuis qu'il a tout dans le rouleau 3 équivaut à ce que le nombre le plus élevé soit 3 - comme le montrent les chiffres suivants ROLL >= 3
. Nous no puede l'écrire comme ROLL = {3,4}
Mais il s'agit d'une comparaison de séquence à séquence, qui fonctionne différemment).