Mettre en œuvre le cascadeur de dés Catenative Doomsday de Homestuck

29

Défi

Je suis attaqué par le Larcenous Midnight Crew et j'ai besoin d'invoquer le Catenative Doomsday Dice Cascader afin de me défendre. Comme je manque d'espace, j'ai besoin que le code soit aussi court que possible.

L'algorithme du Cascader de dés Catenative Doomsday est le suivant:

Tout d'abord, le dé à six faces dans la bulle principale est lancé et le résultat déterminera le nombre d'itérations de la prochaine étape.

Commencez avec un dé à six faces. Pour autant de fois que le jet du dé Prime Bubble, multipliez le nombre de faces du dé suivant par le résultat du jet du dé en cours. Par exemple, si sur votre premier jet du dé à six faces votre jet est de 2, alors votre prochain dé aura 6 * 2 = 12 faces.

Votre objectif est d'écrire une fonction ou un programme qui ne prend aucune entrée et génère le résultat final du dernier dé lancé. Puisqu'il s'agit de , le nombre d'octets le plus bas dans chaque langue gagne!

Exemples

Exemple # 1 (extrait directement du lien ci-dessus):

The Prime Bubble rolls a 6, meaning that the Cascader will iterate six times

#1: We always start with a 6 sided die, and it rolls a 2, so the next die has 6x2=12 sides
#2: The 12 sided die rolls an 8, meaning that the third die has 12x8=96 sides
#3: The 96 sided die rolls a 35, meaning that die 4 has 96x35=3360 sides
#4: The 3360 sided die rolls a 2922, so die 5 has 3360x2922 = 9,817,920 sides
#5: The 9.8 million sided die rolls a 5,101,894, so the final die has 50,089,987,140,480 sides
#6: The 50 trillion sided die rolls a one. Hooray. 
Since the last die rolled gave a 1, your function or program should output 1.

Exemple # 2

The Prime Bubble rolls a 2, meaning that the Cascader will iterate twice.

#1: We always start with a 6 sided die, and it rolls a 4, so the next die has 6x4 = 24 sides
#2: The 24 sided die rolls a 14

Since the last die rolled gave a 14, your function or program should output 14.
Bazinga_9000
la source
4
Quelle est la sortie maximale? Si chaque lancer donne le côté maximum? Je pense que c'est 7958661109946400884391936 = ((((6 ^ 2) ^ 2) ^ 2) ^ 2) ^ 2 = 6 ^ (2 ^ 5) = 6 ^ 32
Kjetil S.
6
@KjetilS. En effet, et la probabilité de cette sortie devrait être16i=05(62i)=16×6×62×64×68×616×632=12155416739906037495048372267884096782336
Jonathan Allan
3
Est-ce censé être aléatoire? La question ne mentionne rien du tout au hasard?
Wheat Wizard
10
@ SriotchilismO'Zaic Le lancer de dés implique l'aléatoire.
mbomb007
6
@ SriotchilismO'Zaic xkcd.com/221
Neyt

Réponses:

8

Perl 6 , 43 37 octets

-6 octets grâce à nwellnhof

{(6,{roll 1..[*] @_:}...*)[1+6.rand]}

Essayez-le en ligne!

Bloc de code anonyme qui renvoie le résultat du dé du jour du jugement dernier.

Explication:

{                                   }   # Anonymous code block
 (                       )[1+6.rand]    # Take a random number from
                     ...*               # The infinite list of
  6,{roll 1..[*] @_:}                   # Cascading dice values
  6,                                    # Starting from 6
    {roll          :}                   # And choosing a random value from
          1..                           # One to
             [*] @_                     # The product of every value so far
Jo King
la source
5

J , 21 octets

1+[:?(*1+?)^:(?`])@6x

Essayez-le en ligne!

+6 octets grâce à un problème de logique repéré par FrownyFrog

REMARQUE: J n'a pas de verbes niladiques. Cependant, ce verbe fonctionnera de la même manière quel que soit l'argument que vous lui donnerez. Dans l'exemple TIO, je l'appelle avec 0, mais j'aurais pu utiliser 99ou ''tout aussi bien.

Comment

  • 1+ ajouter un à ...
  • [:?un seul rouleau d'une matrice à n côtés (côtés lecture 0à n-1), où le nombre nest déterminé par ...
  • (*1+?)prendre l'argument actuel yet lancer ?pour produire un nombre aléatoire entre 0et y-1. 1+fait que 1pour y, y compris. Enfin, le *crée un crochet en J, qui le multipliera à ynouveau.
  • ^: faites cela plusieurs fois ...
  • (?`]) ?lancer l'argument initial, qui est 6, pour déterminer combien de fois répéter. Si nous roulons 0(correspondant à un 1sur la bulle principale), l'argument passera inchangé. Le ]indique que 6, inchangée, sera la valeur de départ du (*1+?)verbe répété qui détermine la valeur du dé pour le lancer final.
  • @6xattache le verbe constant 6, afin que nous puissions l'appeler avec n'importe quoi, et xforce J à utiliser le calcul entier étendu dont nous avons besoin pour les nombres éventuellement énormes.
Jonas
la source
in this case 0 executes the previous verb once, 1 twice, etcpourquoi donc?
FrownyFrog
parce que j'ai fait une erreur :(. réparera bientôt.
Jonah
Fixé maintenant. Merci.
Jonah
4

K (oK) , 32 octets

Solution:

*|{x,1+1?x:(*).x}/[*a;6,a:1+1?6]

Essayez-le en ligne!

Commencez par 6 et "1 choisissez 6", répétez sur "1 choisissez 6" fois:

*|{x,1+1?x:(*).x}/[*a;6,a:1+1?6] / the solution
  {             }/[n;    c     ] / iterate over lambda n times with starting condition c
                            1?6  / 1 choose 6, between 0..5 (returns a list of 1 item)
                          1+     / add 1 (so between 1..6)
                        a:       / store as 'a'
                      6,         / prepend 6, the number of sides of the first dice
                   *a            / we are iterating between 0 and 5 times, take first (*)
           (*).x                 / multi-argument apply (.) multiply (*) to x, e.g. 6*2 => 12
         x:                      / save that as 'x'
       1?                        / 1 choose x, between 0..x-1
     1+                          / add 1 (so between 1..x)
   x,                            / prepend x
*|                               / reverse-first aka 'last'

Vous pouvez voir les itérations en basculant sur pour un scan , par exemple

(6 3        / 1 choose 6 => 3, so perform 3 iterations
 18 15      / 1 choose (6*3=18) => 15
 270 31     / 1 choose (18*15=270) => 31
 8370 5280) / 1 choose (270*31=8730) => 5280
streetster
la source
1
(*).x-> */xet { }/[*a;6,a:1+1?6]->a{ }/6,a:*1+1?6
ngn
4

Gelée , 9 octets

6X×$5СXX

Un lien niladique qui donne un entier positif.

Essayez-le en ligne!

Enregistrer un octet sur le plus évident 6X×$6X’¤¡X

Comment?

6X×$5СXX - Link: no arguments
6         - initialise left argument to 6
    5С   - repeat five times, collecting up as we go: -> a list of 6 possible dice sizes
   $      -   last two links as a monad = f(v):           e.g [6,18,288,4032,1382976,216315425088]
 X        -     random number in [1,v]                     or [6,6,6,6,6,6]
  ×       -     multiply (by v)                            or [6,36,1296,1679616,2821109907456,7958661109946400884391936]
       X  - random choice (since the input is now a list) -> faces (on final die)
        X - random number in [1,faces]
Jonathan Allan
la source
Agréable. J'essayais de penser à un moyen d'aller au-delà de ma réponse «évidente», mais je n'ai pas pensé à générer tous les dés et à en choisir un au hasard.
Nick Kennedy
Hé, j'ai manqué que vous ayez posté presque cette réponse exacte!
Jonathan Allan
3

05AB1E , 10 octets

X6DLΩF*DLΩ

Le choix aléatoire intégré pour les grandes listes est assez lent, il peut donc en résulter un délai d'attente si le rouleau Prime Bubble est par exemple un 6.

Essayez-le en ligne ou essayez-le en ligne avec des impressions supplémentaires pour voir les rouleaux . (TIO utilise la version héritée de 05AB1E, car elle est légèrement plus rapide.)

Explication:

X           # Push a 1 to the stack
 6          # Push a 6 to the stack
  D         # Push another 6 to the stack
   L        # Pop the top 6, and push a list [1,2,3,4,5,6] to the stack
    Ω       # Pop and push a random item from this list (this is out Prime Bubble roll)
     F      # Loop that many times:
      *     #  Multiply the top two values on the stack
            #  (which is why we had the initial 1 and duplicated 6 before the loop)
       D    #  Duplicate this result
        LΩ  #  Pop and push a random value from its ranged list again
            # (after the loop, output the top of the stack implicitly)
Kevin Cruijssen
la source
3

Gelée , 9 octets

6×X$X’$¡X

Essayez-le en ligne!

La réponse de Jonathan Allan affirme qu'il est

Enregistrer un octet sur le plus évident 6X×$6X’¤¡X

. En fait, nous n'avons pas besoin d'apporter une modification aussi importante. Par conséquent, c'est une approche alternative à la réponse de Jonathan Allan, et, aussi, un lieu de repos pour mon 6 octets invalide initial. :(

Erik le Outgolfer
la source
2

Fusain , 16 octets

⊞υ⁶F⊕‽⁶⊞υ⊕‽ΠυI⊟υ

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

⊞υ⁶

Poussez 6 vers la liste prédéfinie.

F⊕‽⁶

Répétez un nombre aléatoire de fois de 1 à 6 ...

⊞υ⊕‽Πυ

... poussez un nombre aléatoire entre 1 et le produit de la liste dans la liste.

I⊟υ

Sortez le dernier numéro poussé dans la liste.

Approche alternative, également 16 octets

≔⁶θF‽⁶≧×⊕‽θθI⊕‽θ

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

≔⁶θ

Définissez le nombre de côtés sur 6.

F‽⁶

Répétez un nombre aléatoire entre 0 et 5 fois ...

≧×⊕‽θθ

... multipliez le nombre de côtés par un nombre aléatoire de 1 au nombre de côtés.

I⊕‽θ

Imprimez un nombre aléatoire de 1 au nombre de côtés.

Neil
la source
2

Python 3 , 76 octets

from random import*
r=randint
a=6
for i in" "*r(0,5):a*=r(1,a)
print(r(1,a))

Essayez-le en ligne!

-2 octets grâce à TFeld

HyperNeutrino
la source
1
-2 octets en modifiant l'importation
TFeld
@TFeld thanks [filler]
HyperNeutrino
2

R , 43 octets

s=sample
for(i in 1:s(k<-6))T=s(k<-k*T,1)
T

Essayez-le en ligne!

kgarde une trace du nombre actuel de faces sur le dé. Utilise le fait qui Test initialisé en tant que 1.

J'ai essayé quelques autres choses, mais je n'ai pas pu battre cette approche simple et directe.

Robin Ryder
la source
1

Gelée , 10 octets

6×X$6X’¤¡X

Essayez-le en ligne!

Explication

       ¤   | Following as a nilad:
    6X     | - A random number between 1 and 6
      ’    | - Decrease by 1 (call this N)
6          | Now, start with 6
   $    ¡  | Repeat the following N times, as a monad
 ×         | - Multiply by:
  X        |   - A random number between 1 and the current total
         X | Finally, generate a random number between 1 and the output of the above loop
Nick Kennedy
la source
1

Rubis , 41 octets

r=6;rand(2..7).times{r*=$s=rand 1..r};p$s

Essayez-le en ligne!

Explication

r=6                                 # Set dice number to 6

rand(2..7).times{               }   # Repeat X times, where X=dice roll+1
                 r*=$s=rand 1..r    # Multiply dice number by a dice roll
                                    # Save the most recent dice roll

p$s                                 # Print last dice roll (this is why
                                    #  we did the last step one extra time)
Encre de valeur
la source
1

Java 10, 214 93 86 octets

v->{int r=6,n=0;for(var d=Math.random()*6;d-->0;n*=Math.random(),r*=++n)n=r;return n;}

Essayez-le en ligne ou essayez-le en ligne avec des lignes d'impression supplémentaires pour voir les étapes .

intjava.math.BigInteger632intlongBigIntegerintBigIntegers

Explication:

v->{                        // Method with empty unused parameter & integer return-type
  int r=6,                  //  The range in which to roll, starting at 6
      n=0;                  //  The roll itself (which must be initialized, therefor is 0)
  for(var d=Math.random()*6;//  Roll the Prime Bubble Dice
      d-->0                 //  Loop that many times:
      ;                     //    After every iteration:
       n*=Math.random(),    //     Roll a random dice in the range [0, n)
       r*=++n)              //     Increase `n` by 1 first with `++n`, so the range is [1,n]
                            //     And then multiply `r` by `n` for the new range
    n=r;                    //   Set `n` to `r`
  return n;}                //  After the loop, return `n` as result
Kevin Cruijssen
la source
Publiez la solution qui ne fait pas de BigInteger votre solution concurrente.
Stackstuck
232int
Je vais voir si je peux trouver quelque chose sur meta à ce sujet.
Stackstuck
1
OP dit ne vous inquiétez pas des limites de taille entières. Utilisez le inttype.
Stackstuck
1
@Stackstuck Done, et joué au golf 7 octets dans le processus. :)
Kevin Cruijssen
0

PHP , 59 octets

$r=$q=rand(1,$s=6);while($l++<$q)$r=rand(1,$s*=$r);print$r;

étendu:

$r=$q=rand(1,$s=6);
while($l++<$q)$ 
    r=rand(1,$s*=$r);
print$r;

Je ne sais pas si je suis censé inclure la balise ouverte.

Sur ma machine, il se bloque s'il $s*$rest trop grand, donc il ne s'imprime pas $q>=5parfois ... parce que les chiffres deviennent si gros. Pas sûr d'un correctif.

Roseau
la source
0

Pyth , 14 octets

uhO=*|Z6GO6hO6

Essayez-le en ligne!

uhO=*|Z6GO6hO6   
         O6      Random number in range [0-6)
u                Perform the following the above number of times...
           hO6   ... with starting value G a random number in range [1-6]:
    *   G          Multiply G with...
     |Z6           The value of Z, or 6 if it's the first time through (Z is 0 at program start)
   =  Z            Assign the above back into Z
  O                Random number in range [0-Z)
 h                 Increment
                 Implicit print result of final iteration
Sok
la source
0

C # (.NET Core) , 136 octets

class A{static void Main(){var r=new System.Random();int i=r.Next(6),j=6;while(i-->0)j*=1+r.Next(j);System.Console.Write(r.Next(j)+1);}}

Essayez-le en ligne!

Je suis presque sûr que cela fonctionne, étant donné l'hypothèse d'une longueur entière infinie que nous aimons ici. Si je dois réellement gérer le débordement, j'aurais besoin de sortir d'une classe entièrement différente.

Stackstuck
la source
System.ArgumentOutOfRangeException: 'maxValue' must be greater than zero632intlongBigIntegers
@KevinCruijssen oui, c'est tout l'intérêt de mon commentaire.
Stackstuck