Thực hiện Xúc xắc xúc xắc xúc xắc của Homestuck


29

Thử thách

Tôi đang bị tấn công bởi nhóm Midnight láu cá và tôi cần triệu tập Dices Dadersday Doomsday Dices để bảo vệ chính mình. Vì tôi còn ít không gian, tôi cần mã càng ngắn càng tốt.

Thuật toán cho Cascice Catenative Doomsday Dice như sau:

Đầu tiên, sáu mặt chết trong Bong bóng Prime được cuộn và kết quả sẽ xác định có bao nhiêu lần lặp lại của bước tiếp theo diễn ra.

Bắt đầu với một cái chết sáu mặt. Trong nhiều lần cuộn của Prime Bubble die, nhân số lượng các cạnh của lần chết tiếp theo với kết quả của cuộn của die hiện tại. Ví dụ: nếu trong lần lăn đầu tiên của bạn thì sáu mặt của bạn là 2, thì lần chết tiếp theo của bạn sẽ có 6 * 2 = 12 mặt.

Mục tiêu của bạn là viết một hàm hoặc chương trình không có đầu vào và xuất kết quả cuối cùng của lần lăn cuối cùng. Vì đây là , số byte thấp nhất trong mỗi ngôn ngữ sẽ thắng!

Ví dụ

Ví dụ # 1 (Lấy trực tiếp từ liên kết trên):

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.

Ví dụ # 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
Sản lượng tối đa là gì? Nếu mỗi cuộn kết quả ở phía tối đa? Tôi nghĩ đó là 7958661109946400884391936 = ((((6 ^ 2) ^ 2) ^ 2) ^ 2) ^ 2 = 6 ^ (2 ^ 5) = 6 ^ 32
Kjetil S.

6
@KjetilS. Thật vậy, và khả năng đầu ra đó phải là 16i=05(62i)=16×6×62×64×68×616×632=12155416739906037495048372267884096782336
Jonathan Allan

3
Đây có phải là ngẫu nhiên? Câu hỏi không đề cập gì về sự ngẫu nhiên cả?
Thuật sĩ lúa mì

10
@ SriotchilismO'Zoms Dice-cán ngụ ý ngẫu nhiên.
mbomb007

6
@ SriotchilismO'Z cổ xkcd.com/221
Neyt

Câu trả lời:



8

Perl 6 , 43 37 byte

-6 byte nhờ nwellnhof

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

Hãy thử trực tuyến!

Khối mã ẩn danh trả về kết quả súc sắc ngày tận thế.

Giải trình:

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

Hãy thử trực tuyến!

+6 byte nhờ một vấn đề logic được phát hiện bởi FrownyFrog

LƯU Ý: J không có động từ niladic. Tuy nhiên, động từ này sẽ hoạt động như nhau cho dù bạn đưa ra lập luận nào. Trong ví dụ TIO, tôi gọi nó bằng 0, nhưng tôi có thể đã sử dụng 99hoặc ''là tốt.

làm sao

  • 1+ thêm một vào ...
  • [:?một cuộn duy nhất của một die n chiều (bên đọc 0đến n-1), nơi mà số lượng nđược xác định bởi ...
  • (*1+?)lấy đối số hiện tại yvà cuộn ?để tạo ra một số ngẫu nhiên giữa 0y-1. 1+làm cho rằng 1để y, toàn diện. Cuối cùng, *tạo một móc J, nó sẽ nhân nó lên ymột lần nữa.
  • ^: làm điều này nhiều lần ...
  • (?`]) ?cuộn đối số ban đầu, nghĩa là 6, để xác định số lần lặp lại. Nếu chúng ta cuộn 0(tương ứng với a 1trên Bong bóng Prime), đối số sẽ chuyển qua không thay đổi. Chỉ ]ra rằng 6, không thay đổi, sẽ là giá trị bắt đầu của (*1+?)động từ lặp lại xác định giá trị chết cho cuộn cuối cùng.
  • @6xgắn động từ không đổi 6, để chúng ta có thể gọi nó bằng bất cứ thứ gì và xbuộc J sử dụng tính toán số nguyên mở rộng mà chúng ta cần cho các số có thể rất lớn.

in this case 0 executes the previous verb once, 1 twice, etctại sao vậy?
FrownyFrog

bởi vì tôi đã mắc lỗi :(. sẽ khắc phục sớm.
Jonah

Đã sửa bây giờ. Cảm ơn.
Giô-na

4

K (oK) , 32 byte

Dung dịch:

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

Hãy thử trực tuyến!

Bắt đầu với 6 và "1 chọn 6", lặp lại qua "1 chọn 6" lần:

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

Bạn có thể thấy các lần lặp bằng cách chuyển qua quét để quét , ví dụ:

(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-> */x{ }/[*a;6,a:1+1?6]->a{ }/6,a:*1+1?6
ngn

4

Thạch , 9 byte

6X×$5СXX

Một liên kết niladic mang lại một số nguyên dương.

Hãy thử trực tuyến!

Lưu một byte qua rõ ràng hơn 6X×$6X’¤¡X

Làm sao?

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]

Tốt đẹp. Tôi đã cố gắng nghĩ cách để vượt ra khỏi câu trả lời 'rõ ràng' của mình, nhưng không nghĩ đến việc tạo ra tất cả xúc xắc và sau đó chọn một cách ngẫu nhiên.
Nick Kennedy

Heh, tôi nhớ rằng bạn đã đăng gần như câu trả lời chính xác!
Jonathan Allan

3

05AB1E , 10 byte

X6DLΩF*DLΩ

Nội dung lựa chọn ngẫu nhiên cho các danh sách lớn khá chậm, do đó có thể dẫn đến thời gian chờ nếu cuộn Prime Bubble chẳng hạn là 6.

Hãy thử trực tuyến hoặc thử trực tuyến với các bản in được thêm vào để xem các cuộn . (TIO sử dụng phiên bản kế thừa của 05AB1E, vì nó nhanh hơn một chút.)

Giải trình:

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

Thạch , 9 byte

6×X$X’$¡X

Hãy thử trực tuyến!

Câu trả lời của Jonathan Allan cho rằng đó là

Lưu một byte qua rõ ràng hơn 6X×$6X’¤¡X

. Trên thực tế, chúng ta không cần phải thực hiện một sửa đổi lớn như vậy. Do đó, đây là một cách tiếp cận thay thế cho câu trả lời của Jonathan Allan, và, cũng là nơi nghỉ ngơi cho 6 -terter không hợp lệ ban đầu của tôi. :



2

Than , 16 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

⊞υ⁶

Đẩy 6 vào danh sách được xác định trước.

F⊕‽⁶

Lặp lại một số lần ngẫu nhiên từ 1 đến 6 ...

⊞υ⊕‽Πυ

... đẩy một số ngẫu nhiên giữa 1 và sản phẩm của danh sách vào danh sách.

I⊟υ

Xuất số cuối cùng được đẩy vào danh sách.

Cách tiếp cận khác, cũng 16 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

≔⁶θ

Đặt số cạnh là 6.

F‽⁶

Lặp lại một số ngẫu nhiên trong khoảng từ 0 đến 5 lần ...

≧×⊕‽θθ

... nhân số cạnh của một số ngẫu nhiên từ 1 đến số cạnh.

I⊕‽θ

In một số ngẫu nhiên từ 1 đến số cạnh.



2

R , 43 byte

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

Hãy thử trực tuyến!

ktheo dõi số lượng khuôn mặt hiện tại trên khuôn. Sử dụng thực tế Tđược khởi tạo là1 .

Tôi đã thử một vài thứ khác, nhưng không thể đánh bại cách tiếp cận đơn giản, đơn giản này.


1

Thạch , 10 byte

6×X$6X’¤¡X

Hãy thử trực tuyến!

Giải trình

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

Hãy thử trực tuyến!

Giải trình

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

Dùng thử trực tuyến hoặc thử trực tuyến với các dòng in bổ sung để xem các bước .

-128 byte bằng cách sử dụng intthay vì java.math.BigInteger.632, kết quả lớn nhất có thể, không phù hợp với bên trong , intcũng longlà lý do tại sao BigIntegerđược sử dụng ban đầu. OP cho phép sử dụng intvà giả sử nó vô cùng lớn, do đó đã lưu hơn 125 byte ở đây. :) ( Ở đây là phiên bản 214 byte trước đó bằng cách sử dụngBigIntegers . )

Giải trình:

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

Đăng giải pháp không làm BigInteger làm giải pháp cạnh tranh của bạn.
Stackstuck

@Stackstuck Sẽ chờ đợi những gì OP nói với bình luận của bạn. Đã sắp làm một mình để xác nhận. Cá nhân tôi sử dụng BigIntegers / BigDecimals cho các thử thách khi cần thiết, trừ khi OP tuyên bố rõ ràng bạn có thể sử dụng kích thước số nguyên tối đa gốc của mình (thường là232, vì vậy intđối với cả Java và .NET C #).
Kevin Cruijssen

Tôi sẽ xem nếu tôi có thể tìm thấy bất cứ điều gì trên meta về điều này.
Stackstuck

1
OP nói đừng lo lắng về giới hạn kích thước nguyên. Sử dụng các intloại.
Stackstuck

1
@Stackstuck Xong và đánh gôn 7 byte trong tiến trình. :)
Kevin Cruijssen

0

PHP , 59 byte

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

mở rộng:

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

Không chắc chắn nếu tôi phải bao gồm các thẻ mở.

Trên máy của tôi, nó gặp sự cố nếu $s*$r quá lớn, do đó $q>=5đôi khi nó không được in ... vì số lượng quá lớn. Không chắc chắn về một sửa chữa.


0

Bình , 14 byte

uhO=*|Z6GO6hO6

Hãy thử trực tuyến!

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

Hãy thử trực tuyến!

Tôi khá chắc chắn rằng điều này hoạt động, với giả định về độ dài nguyên vô hạn mà chúng tôi thích ở đây. Nếu tôi phải thực sự xử lý tràn, tôi cần phải vượt qua một lớp hoàn toàn khác.


Bây giờ nó có thể đưa ra một System.ArgumentOutOfRangeException: 'maxValue' must be greater than zerolỗi. Kết quả tối đa có thể là632, lớn hơn kích thước tối đa của cả hai intlongvì vậy bạn sẽ phải sử dụng BigIntegersthay thế.
Kevin Cruijssen

@KevinCruijssen vâng, đó là toàn bộ nhận xét của tôi.
Stackstuck


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.