Implementar o Cascader de Dados Catenativos do Dia do Juízo Final de Homestuck

29

Desafio

Estou sob ataque da equipe da meia-noite e preciso convocar o Catenative Doomsday Dice Cascader para me defender. Como estou com pouco espaço, preciso que o código seja o mais curto possível.

O algoritmo para o Cascader de Dados do Dia do Juízo Final Catenativo é o seguinte:

Primeiro, o dado de seis lados no Prime Bubble é rolado e o resultado determinará quantas iterações da próxima etapa ocorrerão.

Comece com um dado de seis lados. Por quantas vezes o rolo do dado Prime Bubble, multiplique o número de lados no próximo dado pelo resultado do rolo do dado atual. Por exemplo, se no seu primeiro lançamento do dado de seis lados o seu lançamento for 2, seu próximo dado terá 6 * 2 = 12 lados.

Seu objetivo é escrever uma função ou programa que não receba nenhuma entrada e produz o resultado final do último dado rolado. Como se trata de , a contagem de bytes mais baixa em cada idioma vence!

Exemplos

Exemplo # 1 (extraído diretamente do link acima):

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.

Exemplo 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
fonte
4
Qual é a saída máxima? Se todo rolo resultar no lado máximo? Eu acho que é 7958661109946400884391936 = ((((6 ^ 2) ^ 2) ^ 2) ^ 2) ^ 2) ^ 2 = 6 ^ (2 ^ 5) = 6 ^ 32)
Kjetil S.
6
@KjetilS. De fato, e a probabilidade desse resultado deve ser 16i=05(62i)=16×6×62×64×68×616×632=12155416739906037495048372267884096782336
Jonathan Allan
3
Isso deveria ser aleatório? A pergunta não menciona nada sobre aleatoriedade?
Wheat Wizard
10
@ SriotchilismO'Zaic A rolagem de dados implica aleatoriedade.
mbomb007 01/06
6
@ SriotchilismO'Zaic xkcd.com/221
Neyt

Respostas:

8

Perl 6 , 43 37 bytes

-6 bytes graças a nwellnhof

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

Experimente online!

Bloco de código anônimo que retorna o resultado dos dados do dia do juízo final.

Explicação:

{                                   }   # 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
Brincadeira
fonte
5

J , 21 bytes

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

Experimente online!

+6 bytes graças a um problema de lógica detectado pelo FrownyFrog

NOTA: J não possui verbos niládicos. No entanto, esse verbo funcionará da mesma forma, independentemente do argumento que você fornecer. No exemplo do TIO, estou chamando 0, mas eu poderia ter usado 99ou ''também.

quão

  • 1+ adicione um a ...
  • [:?um único rolo de um dado de face n (lados lendo 0para n-1), onde o número né determinado por ...
  • (*1+?)pegue o argumento atual ye role ?para produzir um número aleatório entre 0e y-1. 1+faz que 1a y, inclusive. Finalmente, *cria um gancho em J, que multiplicará isso ynovamente.
  • ^: faça isso acima muitas vezes ...
  • (?`]) ?role o argumento inicial, ou seja 6, para determinar quantas vezes repetir. Se rolarmos 0(correspondendo a um 1no Prime Bubble), o argumento passará inalterado. A ]indica que 6, inalterado, será o valor de partida de repetida (*1+?)verbo que determina o valor dado para o rolo final.
  • @6xanexa o verbo constante 6, para que possamos chamá-lo com qualquer coisa, e as xforças J a usar a computação de número inteiro estendida que precisamos para os números possivelmente grandes.
Jonah
fonte
in this case 0 executes the previous verb once, 1 twice, etcpor que é que?
FrownyFrog
porque eu cometi um erro :(. irá corrigir em breve.
Jonah
Corrigido agora. Obrigado.
Jonah
4

K (oK) , 32 bytes

Solução:

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

Experimente online!

Comece com 6 e "1 escolha 6", itere sobre "1 escolha 6" vezes:

*|{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'

Você pode ver as iterações alternando para uma varredura , por exemplo

(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
rua
fonte
11
(*).x-> */xe { }/[*a;6,a:1+1?6]->a{ }/6,a:*1+1?6
ngn
4

Geléia , 9 bytes

6X×$5СXX

Um link niládico que gera um número inteiro positivo.

Experimente online!

Salvando um byte sobre o mais óbvio 6X×$6X’¤¡X

Quão?

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
fonte
Agradável. Eu estava tentando pensar em uma maneira de ir além da minha resposta 'óbvia', mas não pensei em gerar todos os dados e depois escolher um aleatoriamente.
Nick Kennedy
Heh, eu senti falta de você ter postado quase a resposta exata!
Jonathan Allan
3

05AB1E , 10 bytes

X6DLΩF*DLΩ

A escolha aleatória incorporada para listas grandes é muito lenta, portanto, pode resultar em um tempo limite se o lançamento do Prime Bubble for, por exemplo, um 6.

Experimente on-line ou on -line com impressões adicionais para ver os rolos . (O TIO usa a versão herdada do 05AB1E, pois é um pouco mais rápida.)

Explicação:

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
fonte
3

Geléia , 9 bytes

6×X$X’$¡X

Experimente online!

A resposta de Jonathan Allan afirma que é

Salvando um byte sobre o mais óbvio 6X×$6X’¤¡X

. De fato, não precisamos fazer uma modificação tão grande. Portanto, essa é uma abordagem alternativa à resposta de Jonathan Allan e, também, um local de descanso para meu 6-byter inicial inválido. :(

Erik, o Outgolfer
fonte
2

Perl 5 , 54 bytes

$a=6;map$a*=$r=1+int rand$a,0..rand 6;say 1+int rand$r

Experimente online!

Xcali
fonte
Isso é um rand demais, você deveria dizer $ r
Grimmy
2

Carvão , 16 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação:

⊞υ⁶

Pressione 6 para a lista predefinida.

F⊕‽⁶

Repita um número aleatório de vezes de 1 a 6 ...

⊞υ⊕‽Πυ

... envie um número aleatório entre 1 e o produto da lista para a lista.

I⊟υ

Envie o último número enviado para a lista.

Abordagem alternativa, também 16 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação:

≔⁶θ

Defina o número de lados para 6.

F‽⁶

Repita um número aleatório entre 0 e 5 vezes ...

≧×⊕‽θθ

... multiplique o número de lados por um número aleatório de 1 para o número de lados.

I⊕‽θ

Imprima um número aleatório de 1 ao número de lados.

Neil
fonte
2

Python 3 , 76 bytes

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

Experimente online!

-2 bytes graças ao TFeld

HyperNeutrino
fonte
11
-2 bytes alterando a importação
TFeld
@TFeld thanks [filler]
HyperNeutrino
2

R , 43 bytes

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

Experimente online!

kcontrola o número atual de faces no dado. Usa o fato de que Té inicializado como 1.

Tentei algumas outras coisas, mas não consegui superar essa abordagem simples e direta.

Robin Ryder
fonte
1

Gelatina , 10 bytes

6×X$6X’¤¡X

Experimente online!

Explicação

       ¤   | 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
fonte
1

Ruby , 41 bytes

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

Experimente online!

Explicação

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)
Value Ink
fonte
1

Java 10, 214 93 86 bytes

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

Experimente on-line ou on -line com linhas de impressão adicionais para ver as etapas .

intjava.math.BigInteger632intlongBigIntegerintBigIntegers

Explicação:

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
fonte
Poste a solução que não faz o BigInteger como sua solução concorrente.
Stackstuck 03/06
232int
Vou ver se consigo encontrar algo sobre meta sobre isso.
Stackstuck
11
O OP diz que não se preocupe com os limites de tamanho inteiro. Use o inttipo
Stackstuck
11
@Stackstuck Pronto, e jogou 7 bytes no processo. :)
Kevin Cruijssen
0

PHP , 59 bytes

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

expandido:

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

Não tenho certeza se devo incluir a tag aberta.

Na minha máquina, ele trava se $s*$rfor muito grande, para que não seja impresso $q>=5algumas vezes ... porque os números ficam muito grandes. Não tenho certeza de uma correção.

Reed
fonte
0

Pitão , 14 bytes

uhO=*|Z6GO6hO6

Experimente online!

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
fonte
0

C # (.NET Core) , 136 bytes

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);}}

Experimente online!

Estou bastante certo de que este obras, dada a assunção de comprimento inteiro infinito que estamos Apaixonado por aqui. Se eu realmente tiver que lidar com o estouro, precisaria interromper uma classe totalmente diferente.

Stackstuck
fonte
System.ArgumentOutOfRangeException: 'maxValue' must be greater than zero632intlongBigIntegers
@KevinCruijssen sim, esse é o ponto principal do meu comentário.
Stackstuck 03/06
0

Julia 1.0 , 60 bytes

g(b=big(6),r=rand)=(for i in 1:r(0:5) b=b*r(1:b) end;r(1:b))

b=big(6)faz funcionar com números inteiros de tamanho arbitrário Experimente online!

gggg
fonte