Melaksanakan Catenative Doomsday Dice Cascader Homestuck


29

Tantangan

Saya sedang diserang oleh Midnight Crew yang berbahaya dan saya perlu memanggil Daten Cascading Doomsday Dicesday untuk mempertahankan diri. Karena saya kekurangan ruang, saya perlu kode sesingkat mungkin.

Algoritma untuk Catenative Doomsday Dice Cascader adalah sebagai berikut:

Pertama, dadu bersisi enam dalam Gelembung Utama digulirkan, dan hasilnya akan menentukan berapa banyak iterasi pada langkah berikutnya yang terjadi.

Mulailah dengan dadu enam sisi. Untuk sebanyak gulungan Prime Bubble die, gandakan jumlah sisi pada die berikutnya dengan hasil dari roll die saat ini. Misalnya, jika pada gulungan pertama Anda dari dadu enam sisi, gulungan Anda adalah 2, maka dadu Anda berikutnya akan memiliki 6 * 2 = 12 sisi.

Tujuan Anda adalah untuk menulis suatu fungsi atau program yang tidak mengambil input dan mengeluarkan hasil akhir dari die roll terakhir. Karena ini adalah , jumlah byte terendah dalam setiap bahasa menang!

Contohnya

Contoh # 1 (Diambil langsung dari tautan di atas):

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.

Contoh # 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.

4
Apa hasil maksimalnya? Jika setiap roll menghasilkan sisi maksimum? Saya pikir itu 7958661109946400884391936 = ((((6 ^ 2) ^ 2) ^ 2) ^ 2) ^ 2 = 6 ^ (2 ^ 5) = 6 ^ 32
Kjetil S.

6
@KjetilS. Memang, dan kemungkinan output itu harus 16saya=05(62saya)=16×6×62×64×68×616×632=12155416739906037495048372267884096782336
Jonathan Allan

3
Apakah ini seharusnya acak? Pertanyaannya tidak menyebutkan apa-apa tentang keacakan sama sekali?
Wheat Wizard

10
@ SriotchilismO'Zaic Dice-rolling menyiratkan keacakan.
mbomb007

6
@ SriotchilismO'Zaic xkcd.com/221
Neyt

Jawaban:



8

Perl 6 , 43 37 byte

-6 byte terima kasih kepada nwellnhof

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

Cobalah online!

Blok kode anonim yang mengembalikan hasil dadu kiamat.

Penjelasan:

{                                   }   # 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


5

J , 21 byte

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

Cobalah online!

+6 byte berkat masalah logika yang terlihat oleh FrownyFrog

CATATAN: J tidak memiliki kata kerja niladik. Namun, kata kerja ini akan bekerja sama tidak peduli apa argumen yang Anda berikan. Dalam contoh TIO, saya menyebutnya dengan 0, tetapi saya bisa menggunakan 99atau ''hanya juga.

bagaimana

  • 1+ tambahkan satu ke ...
  • [:?satu gulungan dadu bersisi-n (sisi membaca 0ke n-1), di mana jumlahnya nditentukan oleh ...
  • (*1+?)ambil argumen saat ini ydan gulung ?untuk menghasilkan angka acak antara 0dan y-1. 1+membuat itu 1menjadi y, inklusif. Akhirnya *menciptakan hook J, yang akan mengalikannya ylagi.
  • ^: lakukan hal di atas ini berkali-kali ...
  • (?`]) ?gulung argumen awal, yaitu 6, untuk menentukan berapa kali mengulangi. Jika kita menggulung 0(sesuai dengan a 1di Bubble Prime), argumen akan melewati tidak berubah. The ]menunjukkan bahwa 6, tidak berubah, akan menjadi nilai mulai dari mengulangi (*1+?)kata kerja yang menentukan nilai mati untuk roll akhir.
  • @6xmenempelkan kata kerja konstan 6, sehingga kita dapat menyebutnya dengan apa saja, dan xgaya J untuk menggunakan komputasi bilangan bulat diperluas yang kita butuhkan untuk angka yang mungkin sangat besar.

in this case 0 executes the previous verb once, 1 twice, etcmengapa demikian?
FrownyFrog

karena saya melakukan kesalahan :(. akan segera diperbaiki.
Jonah

Diperbaiki sekarang Terima kasih.
Jonah

4

K (oK) , 32 byte

Larutan:

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

Cobalah online!

Mulailah dengan 6 dan "1 pilih 6", ulangi kali "1 pilih 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'

Anda dapat melihat iterasi dengan mengalihkan over untuk pemindaian , misalnya

(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

1
(*).x-> */xdan { }/[*a;6,a:1+1?6]->a{ }/6,a:*1+1?6
ngn

4

Jelly , 9 byte

6X×$5СXX

Tautan niladik yang menghasilkan bilangan bulat positif.

Cobalah online!

Menyimpan byte lebih jelas 6X×$6X’¤¡X

Bagaimana?

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]

Bagus. Saya mencoba memikirkan cara untuk tidak melampaui jawaban 'jelas' saya, tetapi tidak berpikir untuk membuat semua dadu dan kemudian mengambilnya secara acak.
Nick Kennedy

Heh, saya rindu bahwa Anda telah memposting hampir jawaban yang tepat!
Jonathan Allan

3

05AB1E , 10 byte

X6DLΩF*DLΩ

Pilihan acak bawaan untuk daftar besar cukup lambat, sehingga dapat mengakibatkan waktu habis jika gulungan Prime Bubble misalnya 6.

Cobalah online atau coba online dengan cetakan yang ditambahkan untuk melihat gulungan . (TIO menggunakan versi lawas 05AB1E, karena sedikit lebih cepat.)

Penjelasan:

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)

3

Jelly , 9 byte

6×X$X’$¡X

Cobalah online!

Jawaban Jonathan Allan mengklaim itu

Menyimpan byte lebih jelas 6X×$6X’¤¡X

. Sebenarnya, kita tidak perlu melakukan modifikasi sebesar itu. Oleh karena itu, ini adalah pendekatan alternatif untuk jawaban Jonathan Allan, dan, juga, tempat istirahat untuk 6-byter awal saya yang tidak valid. :(



2

Arang , 16 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

⊞υ⁶

Tekan 6 ke daftar yang telah ditentukan.

F⊕‽⁶

Ulangi beberapa kali secara acak dari 1 hingga 6 ...

⊞υ⊕‽Πυ

... dorong nomor acak antara 1 dan produk dari daftar ke daftar.

I⊟υ

Keluarkan nomor terakhir yang didorong ke daftar.

Pendekatan alternatif, juga 16 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

≔⁶θ

Atur jumlah sisi menjadi 6.

F‽⁶

Ulangi angka acak antara 0 dan 5 kali ...

≧×⊕‽θθ

... gandakan jumlah sisi dengan angka acak dari 1 ke jumlah sisi.

I⊕‽θ

Cetak angka acak dari 1 hingga jumlah sisi.



2

R , 43 byte

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

Cobalah online!

kmelacak jumlah wajah saat ini pada cetakan. Menggunakan fakta yang Tdiinisialisasi sebagai 1.

Saya mencoba beberapa hal lain, tetapi tidak bisa mengalahkan pendekatan yang sederhana dan langsung ini.


1

Jelly , 10 byte

6×X$6X’¤¡X

Cobalah online!

Penjelasan

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

1

Ruby , 41 byte

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

Cobalah online!

Penjelasan

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)

1

Java 10, 214 93 86 byte

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

Cobalah secara online atau coba online dengan jalur cetak tambahan untuk melihat langkah-langkahnya .

intjava.math.BigInteger632intlongBigIntegerintBigIntegers

Penjelasan:

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

Posting solusi yang tidak melakukan BigInteger sebagai solusi Anda yang bersaing.
Stackstuck

232int

Saya akan melihat apakah saya dapat menemukan sesuatu tentang meta tentang ini.
Stackstuck

1
OP mengatakan jangan khawatir tentang batasan ukuran bilangan bulat. Gunakan inttipenya.
Stackstuck

1
@Stackstuck Selesai, dan main golf 7 byte dalam proses. :)
Kevin Cruijssen

0

PHP , 59 byte

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

diperluas:

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

Tidak yakin apakah saya harus menyertakan tag terbuka.

Di komputer saya, crash jika $s*$rterlalu besar, sehingga $q>=5kadang-kadang tidak mencetak ... karena jumlahnya menjadi sangat besar. Tidak yakin dengan perbaikan.


0

Pyth , 14 byte

uhO=*|Z6GO6hO6

Cobalah 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

0

C # (.NET Core) , 136 byte

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

Cobalah online!

Saya cukup yakin ini berhasil, dengan asumsi panjang integer tak terbatas yang kita sukai di sini. Jika saya harus benar-benar menangani overflow, saya harus mengeluarkan kelas yang sama sekali berbeda.


System.ArgumentOutOfRangeException: 'maxValue' must be greater than zero632intlongBigIntegers

@KevinCruijssen ya, itulah inti dari komentar saya.
Stackstuck

0

Julia 1.0 , 60 byte

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)membuatnya bekerja dengan bilangan bulat berukuran sembarang Coba online!


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.