Votre tâche consiste à créer un programme qui accepte un nombre entier n > 1
et génère le jet d'un n
dé simple face. Cependant, ce dé suit les règles pour exploser les dés .
Lorsque vous lancez le dé, vérifiez quelle valeur vous avez lancée. Si vous avez obtenu le maximum pour ce type de dé (sur un d4 standard qui serait 4, ou 6 sur un d6, etc.), relancez et ajoutez le nouveau jet à ce total. Chaque jet continue à s'ajouter au total, jusqu'à ce que vous n'obteniez plus le nombre maximum. Ce nombre final est encore ajouté cependant.
Votre programme doit prendre un seul entier n
et lancer le n
dé à explosion . Voici un exemple de distribution pour montrer à quoi cela devrait ressembler n=4
. Notez que vous ne devez jamais sortir de multiples n
, car ils exploseront toujours.
Vous pouvez supposer que la taille de la pile pour toute récursion que vous faites est infinie, et votre fonction aléatoire doit répondre à nos normes d'aléatoire (générateur aléatoire intégré ou heure / date ). Votre fonction aléatoire devrait également être aussi uniforme que possible, par rapport à quelque chose comme une distribution géométrique, car ce sont des dés dont nous parlons.
Réponses:
Code machine x86 (pour Intel Ivy Bridge et versions ultérieures), 17 octets
Les octets de code ci-dessus définissent une fonction qui simule une matrice qui explose. Il faut une seule entrée, passée dans le
ESI
registre, indiquant le nombre maximum de dé. Il renvoie une seule valeur dans leECX
registre, qui est le résultat des rouleaux.En interne, il utilise l'
RDRAND
instruction pour générer un nombre aléatoire. Celui-ci utilise un générateur de nombres aléatoires (RNG) intégré au matériel des processeurs Intel Ivy Bridge et ultérieurs (certains processeurs AMD prennent également en charge cette instruction).La logique de la fonction est par ailleurs assez simple. Le nombre aléatoire généré est mis à l'échelle pour se situer dans la plage souhaitée à l'aide de la technique standard (
(rand % dieSize) + 1
), puis il est vérifié pour voir s'il doit provoquer une explosion. Le résultat final est conservé dans un registre accumulateur.Voici une version annotée montrant les mnémoniques du langage assembleur:
Je triche un peu . Toutes les conventions d'appel x86 standard renvoient le résultat d'une fonction dans le
EAX
registre. Mais, dans le vrai code machine, il n'y a pas de convention d'appel. Vous pouvez utiliser tous les registres que vous souhaitez pour les entrées / sorties. L'utilisationECX
du registre de sortie m'a sauvé 1 octet. Si vous souhaitez utiliserEAX
, insérez uneXCHG eax, ecx
instruction de 1 octet juste avant l'ret
instruction. Cela permute les valeurs des registresEAX
etECX
, copiant efficacement le résultat deECX
dansEAX
et supprimantECX
l'ancienne valeur deEAX
.Essayez-le en ligne!
Voici la fonction équivalente transcrite en C, utilisant l'
__builtin_ia32_rdrand32_step
intrinsèque pris en charge par GCC, Clang et ICC pour générer l'RDRAND
instruction:Fait intéressant, GCC avec le
-Os
drapeau transforme cela en presque exactement le même code machine . Il prend l'entrée auEDI
lieu deESI
, ce qui est complètement arbitraire et ne change rien de fond sur le code. Il doit retourner le résultat dansEAX
, comme je l'ai mentionné précédemment, et il utilise l'MOV
instruction plus efficace (mais plus grande) pour le faire immédiatement avant leRET
. Sinon, samezies. C'est toujours amusant lorsque le processus est entièrement réversible: écrivez le code dans l'assembly, transcrivez-le en C, exécutez-le via un compilateur C et récupérez votre assembly d'origine!la source
Python 2 ,
666461 octets-3 octets grâce à xnor
Essayez-le en ligne!
Le rouleau précédent est stocké dans
c
, ce qui nous permet d'y accéder plusieurs fois sans avoir à le stocker dans une variable, ce qui ne peut pas être fait dans un lambda Python. À chaque récursivité, nous vérifions si nous avons lancé des dés explosifs.c
est initialisé à zéro, il enc%n
est de même pour Falsey. Dans les prochaines itérations, ce ne sera falsey que si des dés explosifs étaient lancés.Python 2 , 55 octets
Essayez-le en ligne!
Mon autre réponse semble être un peu trop technique, car cela semble fonctionner aussi bien ... Je vais le laisser quand même.
la source
c*(c<n)
possiblec%n
.R , 39 octets
Essayez-le en ligne!
Explication: cette solution évite les boucles recursion / while en calculant directement la distribution du nombre d'explosions qui se produiront. Soit le nombre de faces du dé. Si vous dénotez le succès comme un et l'échec comme quoi que ce soit d'autre, alors vous avez une probabilité de succès. Le nombre total d'explosions est le nombre de succès avant le premier échec. Cela correspond à une distribution (voir la page wikipedia , qui définit le succès et l'échec dans l'autre sens). Chaque explosion porte au total. Le jet final suit unn n 1n G e o m e t r i c ( 1 - 1n) nUniform(1,2,…,n-1)n U n i fo r m (1,2,…,n-1) distribution que nous ajoutons au total.
la source
sample
aux normes de hasard, étant donné son biais ?sample
conduit à un manque d'uniformité qui donne un rapport de probabilité max / min aussi élevé que 1,03 ... Choc, n'est-ce pas?!sample
avec ? ;-)Perl 6 , 26 octets
Essayez-le en ligne!
Explication
la source
{sum roll(*,1..$_)...$_>*}
J ,
1611 octetsEssayez-le en ligne!
Explication
TL; DR
1+?
effectue le jet de dé,(+$:)^:=
réitère uniquement lorsqu'il est égal à l'entrée.La fonction est un train de 4 verbes:
Un train, c'est quand 2 verbes ou plus sont concaténés. Ici, la réponse est de la forme
f g h j
:Un soi-disant "4-train" est analysé comme un crochet et une fourchette:
Ainsi, la réponse équivaut à:
Crochets:
(f g) x
etx (f g) y
Un crochet monadique (un argument) de deux verbes, étant donné un argument
x
, l'équivalence suivante est valable:Par exemple,
(* -) 5
évalue à5 * (- 5)
, qui évalue à_25
.Cela signifie que notre 4-train, un crochet de
f
et(g h j)
, équivaut à:Mais que fait
f
-on ici?(+$:)^:=
est une conjonction de deux verbes utilisant la conjonction Power^:
: un autre hook ((+$:)
) et un verbe (=
). Notez ici quef
c'est dyadique - il a deux arguments (x
et(g h j) x
). Nous devons donc regarder comment^:
se comporte. La conjonction de puissancef^:o
prend un verbef
et soit un verbe soit un nomo
(un nom n'est qu'un élément de données) et applique desf
o
temps. Par exemple, prenezo = 3
. Les équivalences suivantes sont valables:Si
o
est un verbe, la conjonction de puissance évaluera simplemento
les arguments et utilisera le résultat du nom comme nombre de répétitions.Pour notre verbe,
o
est=
, le verbe d'égalité. Il évalue à0
des arguments différents et à1
des arguments égaux. Nous répétons le crochet(+$:)
une fois pour des arguments égaux et pas de temps pour des arguments différents. Pour faciliter la notation de l'explication, lety ⇔ ((g h j) x)
. N'oubliez pas que notre crochet initial est équivalent à ceci:En élargissant la conjonction, cela devient:
Si
x
ety
sont les mêmes, cela devient:Sinon, cela devient:
Maintenant, nous avons vu des fourches monadiques. Ici, nous avons une fourche dyadique:
Donc, quand
x
ety
sont les mêmes, nous obtenons:Qu'est-ce que c'est
$:
? Il fait référence à l'ensemble du verbe lui-même et permet la récursivité. Cela signifie que, quandx
et yare the same, we apply the verb to
yand add
x` à elle.Fourches:
(g h j) x
Maintenant, que fait la fourche intérieure? C'était
y
dans notre dernier exemple. Pour une fourche monadique de trois verbes, étant donné un argumentx
, l'équivalence suivante est vérifiée:Pour cet exemple suivant, supposons que nous avons des verbes du nom
SUM
,DIVIDE
etLENGTH
qui font ce que vous supposez qu'ils pourraient. Si nous concaténons les trois en une fourchette, nous obtenons:Cette fourchette est évaluée à la moyenne de
x
(en supposant qu'ilx
s'agit d'une liste de nombres). En J, nous écrivions en fait ceci comme exemple+/ % #
.Une dernière chose à propos des fourches. Lorsque la "dent" la plus à gauche (dans notre cas symbolique ci-dessus,
g
) est un nom, elle est traitée comme une fonction constante renvoyant cette valeur.Avec tout cela en place, nous pouvons maintenant comprendre la fourchette ci-dessus:
?
donne ici un entier aléatoire dans la plage , nous devons donc transformer la plage pour représenter les dés; l'incrémentation donne la plage .Mettre tous ensemble
Compte tenu de toutes ces choses, notre verbe équivaut à:
Cela exprime la fonctionnalité souhaitée.
la source
(+$:)^:=1+?
Gelée , 7 octets
Essayez-le en ligne!
Utilise la récursivité. Exécute à nouveau le programme (
ß
) et ajoute (+
) si (¡
) le nombre aléatoire (X
) est égal (=
) à l'entrée du programme.}
faitß
agir sur l'entrée du programme et se¥
combine+ß}
en un seul lien pour¡
consommer.Voici une distribution de 1000 sorties pour n = 6 que j'ai collectées à l'aide de ce programme. Tracé avec python / matplotlib.
Voici 5000 points de données de n = 3 sur un graphique semi-journal qui montre la distribution exponentielle (approximativement?).
la source
Pyth -
1211 octetsUtilise tout fonctionnel. Je pense qu'il devrait y avoir une réponse plus intelligente qui simule simplement la distribution.
Essayez-le en ligne .
la source
Python 3 , 80 octets
Essayez-le en ligne!
la source
r.random()
arrive de retourner 0.1-r.random()
devrait fonctionner, cependant.import ... as _
est le plus court!05AB1E , 10 octets
Essayez-le en ligne ou vérifiez les listes .
Alternative de 10 octets:
Essayez-le en ligne ou vérifiez les listes .
Bien que j'aime encore le top parce qu'il contient le «mot»
DIÊ
, ce qui convient au défi.Explication:
la source
.Γ
ou quelque chose.Wolfram Language (Mathematica) , 50 octets
Essayez-le en ligne!
la source
R ,
4742 octetsEssayez-le en ligne!
Crédit à l'approche d' ArBo .
Encore un octet de plus que celui de Robin Ryder , votez pour le sien!
la source
if
pour 46 octets, mais j'ai fini par obtenir un 52 sur un rouleau qui ne devrait pas être possible avec n = 4, donc je ne sais pas s'il se passe une chose étrange avec une limite de récursivité basse, mais je pense qu'il peut être buggé. Essayez-le en ligne!Rubis , 35 octets
Essayez-le en ligne!
la source
x
variable: essayez-le en ligne!APL (Dyalog Unicode) ,
1514 octetsEssayez-le en ligne!
la source
Haskell ,
7776 octetsEssayez-le en ligne!
Merci à killmous pour un octet.
Si nous
<|>
étions dans le prélude, nous pourrions faire mieux avecMonadComprehensions
:Haskell , non concurrent, 66 octets
Essayez-le en ligne!
la source
Python 2 , 53 octets
Essayez-le en ligne!
Utilise l'
or
idée de court-circuit de la réponse d' ArBo . L'expressionrandom()*n//1
génère un nombre de0
àn-1
, en0
prenant la place d'un rouleau den
. Leor
prend ce nombre, sauf s'il est nul (Falsey), il continuen+f(n)
.la source
Japt , 13 octets
L'essayer
Réponse du port d' Arnauld . Compris comment passer un appel récursif;)
Transpiled JS:
la source
N.g(f)
:)U
. Sauter une ligne semble également fonctionner. C'est une bonne astuce :)Japt , 12 octets
C'est peut-être plus court que la solution de Dana, mais c'est beaucoup plus laid. Je ne le poste que parce que cela semble éternel car nous avions une solution Japt qui commençait avec une ligne vide.
L'essayer
la source
PowerShell , 49 octets
Essayez-le en ligne!
Méthode itérative. Définit l'entrée
$args
pour$a
et le$l
rouleau ast (fait pour que nous entrons dans la boucle au moins une fois). Ensuite, tant que le dernier rouleau est-eq
ual à l'entrée, nous continuons à rouler. À l'intérieur de la boucle, nous nous accumulons dans$o
le dernier rouleau, qui est mis à jour en créant une plage de1
à l'entrée$a
et en sélectionnant unRandom
élément de celle-ci. (Honnêtement, je suis un peu surpris que cela$o+=$l=
fonctionne.) Une fois que nous sommes hors de la boucle, nous partons$o
sur le pipeline et la sortie est implicite.la source
Forth (gforth) , 72 octets
Essayez-le en ligne!
Explication du code
la source
Lot, 70 octets
Prend l'entrée
n
comme paramètre de ligne de commande%1
.d
est le rôle actuel,t
le total cumulé. Continue simplement à rouler jusqu'à ce qu'ild
ne soit pas égal àn
.la source
Gelée , 9 octets
Essayez-le en ligne!
Une alternative qui n'a pas cette limitation est:
Gelée , 10 octets
Essayez-le en ligne!
Notez que les deux liens TIO génèrent 400 numéros pour montrer la distribution.
la source
Python 3 ,
8172 octetsEssayez-le en ligne!
-9 octets grâce à ArBo
Explication
la source
from random import*
place.TI-BASIC,
2823 octets-5 octets grâce à ce meta post!
L'entrée est en
Ans
.La sortie est en
Ans
et est implicitement imprimée.Exemples:
Explication:
Remarques:
la source
startTmr
n'est plus nécessaire, cette soumission fonctionnera désormais pour les versions de TI-BASIC antérieures à la TI-84 +SmileBASIC 3, 49 octets
La fonction
D N OUT R
implémente récursivement les jets de dés explosifs.Ungolfed
Notez que dans SmileBASIC, les fonctions peuvent avoir plusieurs valeurs de retour. Si une fonction a une valeur de retour alors
fun in OUT var
etvar = fun(in)
sont exactement les mêmes, c'est pourquoi nous pouvons définir la fonction sousOUT
forme et également l'appeler dans une expression dans le corps de la fonction elle-même. Si j'avais défini la fonction commeDEF D(N)
je l'aurais dit explicitementRETURN R
dans le corps de la fonction; le mélange des deux syntaxes m'a fait gagner des octets.la source
PowerShell , 43 octets (méthode itérative)
Essayez-le en ligne!
PowerShell , 48 octets (méthode récursive)
Essayez-le en ligne!
la source
Gelée , 7 octets
Un lien monadique acceptant un entier
n
, ce qui donne un entier.Comment?
la source
SmileBASIC, 41 octets
Après avoir lu:
J'ai réalisé que plutôt que de vérifier si un lancer de dés était
n
, vous pouvez simplement répéter alors que la somme est un multiple den
.la source
AnyDice , 36 octets
Presque intégré dans la langue:
Pour que cela soit correct, je dois abuser de l'hypothèse de profondeur de récursion infinie. AnyDice limite la profondeur de récursivité avec une profondeur de fonction maximale de propriété globale. la fonction explode intégrée utilise cependant la sienne; profondeur d'explosion - par défaut 2.
Ajouterait encore 25 octets; et ne correspondrait pas vraiment aux exigences car il est théoriquement possible qu'un dé explose plus de 99 fois.
La sortie de la fonction est un dé, c'est-à-dire. un type intégré AnyDice qui est une comparaison des résultats et des probabilités du résultat.
la source
CJam , 19 octets
Explication:
Ou en pseudocode:
En tant qu'organigramme:
Essayez-le en ligne!
la source
Excel VBA, 46 octets
Merci à @TaylorScott
Exécuté dans la fenêtre de commande.
En tant que fonction définie par l'utilisateur.
Excel VBA,
10867 octetsla source
do
..loop while
et en convertissant la fonction en une fonction de fenêtre immédiate. -Do:v=-Int(-[A1]*Rnd):t=t+v:Loop While[A1]=v:?t
- 46 octets