Zaimplementuj Kaskadowy Kości Zagłady Homestuck

29

Wyzwanie

Jestem atakowany przez kradnącą Załogę Północy i muszę wezwać Kaskadowy Kości Kaskadny Dzień Zagłady , aby się obronić. Ponieważ brakuje mi miejsca, kod musi być jak najkrótszy.

Algorytm Kaskadowego Kaskadera Kości Zagłady wygląda następująco:

Najpierw rzuca się sześciostronną kością w Pierwotnym Bańce, a wynik określa, ile iteracji następnego kroku ma miejsce.

Zacznij od sześciościennej kości. Przez tyle razy, ile wynosi rzut kości Prime Bubble, pomnóż liczbę stron na następnej kości przez wynik rzutu bieżącej kości. Na przykład, jeśli na pierwszym rzucie sześciościennej kości twój rzut wynosi 2, to twoja następna kość będzie miała 6 * 2 = 12 stron.

Twoim celem jest napisanie funkcji lub programu, który nie przyjmuje danych wejściowych i wyświetla wynik końcowy ostatniej rzuty. Ponieważ jest to , wygrywa najniższa liczba bajtów w każdym języku!

Przykłady

Przykład nr 1 (zaczerpnięty bezpośrednio z powyższego linku):

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.

Przykład nr 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
źródło
4
Jaka jest maksymalna wydajność? Jeśli każdy rzut daje maksymalną stronę? Myślę, że to 7958661109946400884391936 = ((((6 ^ 2) ^ 2) ^ 2) ^ 2) ^ 2 = 6 ^ (2 ^ 5) = 6 ^ 32
Kjetil S.
6
@KjetilS. Rzeczywiście, prawdopodobieństwo tego wyniku powinno wynosić 16ja=05(62)ja)=16×6×62)×64×68×616×632=12155416739906037495048372267884096782336
Jonathan Allan
3
Czy to ma być przypadek? Pytanie w ogóle nie wspomina o losowości?
Wheat Wizard
10
@ SriotchilismO'Zaic Toczenie kości implikuje losowość.
mbomb007
6
@ SriotchilismO'Zaic xkcd.com/221
Neyt

Odpowiedzi:

8

Perl 6 , 43 37 bajtów

-6 bajtów dzięki nwellnhof

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

Wypróbuj online!

Anonimowy blok kodu, który zwraca wynik kości doomsday.

Wyjaśnienie:

{                                   }   # 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
źródło
5

J , 21 bajtów

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

Wypróbuj online!

+6 bajtów dzięki problemowi logicznemu wykrytemu przez FrownyFrog

UWAGA: J nie ma czasowników niladycznych. Jednak ten czasownik będzie działał tak samo bez względu na argument, który podasz. W przykładzie TIO nazywam to za pomocą0 , ale mógłbym użyć 99lub ''równie dobrze.

w jaki sposób

  • 1+ dodaj jeden do ...
  • [:?pojedynczy rzut n-stronnej matrycy (strony czytające 0do n-1), gdzie liczban określa ...
  • (*1+?)weź aktualny argument yi rzuć, ?aby utworzyć losową liczbę między 0i y-1. 1+sprawia, że 1do ywłącznie. Wreszcie *tworzy hak J, który pomnoży to przezy ponownie.
  • ^: rób to wiele razy ...
  • (?`]) ?rzuć początkowym argumentem, to znaczy 6, ile razy powtórzyć. Jeśli wyrzucimy 0(odpowiadające a 1na Prime Bubble), argument przejdzie bez zmian. ]Wskazuje, że 6nie zmieniła się, to jest wartość początkowa powtarzane(*1+?) czasownik, która określa wartości dla dyszy końcowej rolki.
  • @6xdołącza stały czasownik 6, abyśmy mogli go nazwać dowolną nazwą, i xzmusza J do korzystania z rozszerzonego obliczania liczb całkowitych, którego potrzebujemy dla możliwie dużych liczb.
Jonasz
źródło
in this case 0 executes the previous verb once, 1 twice, etcdlaczego?
FrownyFrog
ponieważ popełniłem błąd :(. naprawię wkrótce.
Jonah
Naprawiono teraz. Dzięki.
Jonah
4

K (oK) , 32 bajty

Rozwiązanie:

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

Wypróbuj online!

Zacznij od 6 i „1 wybierz 6”, powtarzaj razy „1 wybierz 6”:

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

Możesz zobaczyć iteracje, przełączając na skanowanie , np

(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
źródło
1
(*).x-> */xi { }/[*a;6,a:1+1?6]->a{ }/6,a:*1+1?6
ngn
4

Galaretka , 9 bajtów

6X×$5СXX

Link niladyczny, który daje dodatnią liczbę całkowitą.

Wypróbuj online!

Zapisywanie bajtu nad bardziej oczywistym 6X×$6X’¤¡X

W jaki sposób?

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
źródło
Miły. Próbowałem wymyślić sposób wyjścia poza moją „oczywistą” odpowiedź, ale nie myślałem o wygenerowaniu wszystkich kości, a następnie o losowym wybraniu jednej z nich.
Nick Kennedy
Hej, tęskniłem za tym, że podałeś prawie taką dokładną odpowiedź!
Jonathan Allan
3

05AB1E , 10 bajtów

X6DLΩF*DLΩ

Wbudowany losowy wybór dla dużych list jest dość wolny, więc może spowodować przekroczenie limitu czasu, jeśli rzut Pierwszej Bańki to na przykład 6.

Wypróbuj online lub wypróbuj online z dodanymi nadrukami, aby zobaczyć rolki . (TIO używa starszej wersji 05AB1E, ponieważ jest nieco szybsza.)

Wyjaśnienie:

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
źródło
3

Galaretka , 9 bajtów

6×X$X’$¡X

Wypróbuj online!

Odpowiedź Jonathana Allana twierdzi, że tak

Zapisywanie bajtu nad bardziej oczywistym 6X×$6X’¤¡X

. W rzeczywistości nie musimy dokonywać tak dużej modyfikacji. Dlatego jest to alternatywne podejście do odpowiedzi Jonathana Allana, a także miejsce spoczynku dla mojego początkowego nieprawidłowego 6-bajta. :(

Erik the Outgolfer
źródło
2

Perl 5 , 54 bajtów

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

Wypróbuj online!

Xcali
źródło
To o jeden rand za dużo, powinieneś po prostu powiedzieć $ r
Grimmy
2

Węgiel drzewny , 16 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

⊞υ⁶

Naciśnij przycisk 6, aby przejść do wstępnie zdefiniowanej listy.

F⊕‽⁶

Powtórz losową liczbę razy od 1 do 6 ...

⊞υ⊕‽Πυ

... wypchnij losową liczbę między 1 a iloczynem listy na listę.

I⊟υ

Wypisz ostatnią liczbę wypchniętą na listę.

Alternatywne podejście, również 16 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

≔⁶θ

Ustaw liczbę boków na 6.

F‽⁶

Powtórz losową liczbę od 0 do 5 razy ...

≧×⊕‽θθ

... pomnóż liczbę stron przez losową liczbę od 1 do liczby stron.

I⊕‽θ

Wydrukuj losową liczbę od 1 do liczby stron.

Neil
źródło
2

Python 3 , 76 bajtów

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

Wypróbuj online!

-2 bajty dzięki TFeld

HyperNeutrino
źródło
1
-2 bajty poprzez zmianę importu
TFeld
@TFeld dzięki [wypełniacz]
HyperNeutrino
2

R , 43 bajty

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

Wypróbuj online!

kśledzi bieżącą liczbę twarzy na kości. Wykorzystuje fakt, że Tjest inicjowany jako 1.

Próbowałem kilku innych rzeczy, ale nie byłem w stanie pokonać tego prostego, bezpośredniego podejścia.

Robin Ryder
źródło
1

Galaretka , 10 bajtów

6×X$6X’¤¡X

Wypróbuj online!

Wyjaśnienie

       ¤   | 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
źródło
1

Rubin , 41 bajtów

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

Wypróbuj online!

Wyjaśnienie

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)
Wartość tuszu
źródło
1

Java 10, 214 93 86 bajtów

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

Wypróbuj online lub wypróbuj online z dodatkowymi liniami drukowania, aby zobaczyć kroki .

intjava.math.BigInteger632intlongBigIntegerintBigIntegers )

Wyjaśnienie:

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
źródło
Opublikuj rozwiązanie, które nie robi BigInteger jako konkurencyjne rozwiązanie.
Stackstuck
@Stackstuck będzie oczekiwać na to, co OP ma do powiedzenia na Twój komentarz. Już miałam zrobić jedną, żeby to potwierdzić. Osobiście używam BigIntegers / BigDecimals do wyzwań, w których jest to konieczne, chyba że OP wyraźnie stwierdzi, że możesz użyć swojej natywnej maksymalnej liczby całkowitej (która zwykle jest2)32int
Zobaczę, czy mogę znaleźć coś na ten temat w meta.
Stackstuck
1
OP mówi, że nie martw się limitami wielkości całkowitych. Użyj tego inttypu.
Stackstuck
1
@Stackstuck Gotowe i grał w golfa 7 bajtów. :)
Kevin Cruijssen
0

PHP , 59 bajtów

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

rozszerzony:

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

Nie jestem pewien, czy mam dołączyć otwarty tag.

Na moim komputerze zawiesza się, jeśli $s*$rjest zbyt duży, więc $q>=5czasami nie jest drukowany ... ponieważ liczby stają się tak duże. Nie jestem pewien poprawki.

Trzcina
źródło
0

Pyth , 14 bajtów

uhO=*|Z6GO6hO6

Wypróbuj 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
źródło
0

C # (.NET Core) , 136 bajtów

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

Wypróbuj online!

Jestem prawie pewien, że to działa, biorąc pod uwagę założenie o nieskończonej liczbie całkowitej, którą lubimy tutaj. Gdybym musiał poradzić sobie z przepełnieniem, musiałbym wykreślić zupełnie inną klasę.

Stackstuck
źródło
System.ArgumentOutOfRangeException: 'maxValue' must be greater than zero632intlongBigIntegers
@KevinCruijssen tak, o to właśnie chodzi w moim komentarzu.
Stackstuck
0

Julia 1.0 , 60 bajtów

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)sprawia, że ​​działa z liczbami całkowitymi o dowolnym rozmiarze Wypróbuj online!

gggg
źródło