Xúc xắc ngẫu nhiên


14

Trong một con súc sắc tiêu chuẩn (chết), các con số được sắp xếp sao cho các mặt đối diện thêm vào bảy. Viết chương trình ngắn nhất có thể bằng ngôn ngữ ưa thích của bạn, kết quả là ném ngẫu nhiên theo sau là 9 lần rút ngẫu nhiên. Một lần lật là một phần tư của xúc xắc, ví dụ: nếu xúc xắc phải đối mặt với 5, tất cả các lần nhảy có thể là 1,3,4 và 6.

Ví dụ về đầu ra mong muốn:

1532131356

Câu trả lời:


5

GolfScript, 26 ký tự

0{(.6,5@--\-.,rand=).}10*;

Một phiên bản nén nhẹ hơn của Joey , về cơ bản giải quyết vấn đề với việc lập chỉ mục bằng không.


9

Hồng ngọc, 44

c=0;10.times{$><<c=([*1..6]-[c,7-c]).sample}

Tôi tìm thấy mẹo [* 1..6] bằng cách thử nghiệm may mắn.


1
Một số thủ thuật hay ở đây, công cụ tuyệt vời. Đánh vào đầu mình vì thiếu phương thức mẫu Array #.
Lars Haugseth

4

JavaScript (71 ký tự)

Bạn có thể cần phải thay thế printbằng alerthoặc một cái gì đó khác, tùy thuộc vào môi trường JavaScript của bạn.

for(C=L=T=0;C++<10;print(L=T))while(!(T-L&&T+L-7))T=Math.random()*6+1|0

hợp nhất các vòng lặp bằng cách tăng điều kiện bên ngoài khi tìm thấy giá trị: for (b = n = 10; n; ab && a + b-7 && print (b = a, n -)) a = Math.random () * 6 + 1 | 0
imma


3

Bash

#/!bin/bash
f=`expr $RANDOM % 6` 
f=`expr $f + 1`
printf "$f"
for ((i=0; i<9; i++))
do
   ((bad=7-$f))
   next=`expr $RANDOM % 6`
   next=`expr $next + 1`
   while [ $next -eq $bad ] || [ $next -eq $f ]
   do
      next=`expr $RANDOM % 6`
      next=`expr $next + 1`
   done
printf "$next"
f=$next
done

mã mẫu: http://ideone.com/CCfro


Việc sử dụng ((var=expression))rất hay - tôi nghĩ rằng cách ngắn nhất là var=$((expression))Nhưng tại sao bạn chỉ sử dụng nó một lần và lãng phí hàng tấn ký tự trên expricks trong backticks?
Peter Taylor

Tôi không làm nhiều kịch bản shell, nhưng vì một số lý do ((var = expr)) ở một số nơi đã thất bại (yeah lạ: P) Kể từ khi tôi bắt đầu kịch bản này, tôi mới hoàn thành. :)
Aman ZeeK Verma


2

Bash chỉ có một vòng lặp: 100 99 98 96

cho ((i = 10, f = RANDOM% 6 + 1; i -;)) làm
in $ f
((n = RANDOM% 4 + 1, m = f <4? f: 7-f, f = n <m | | ++ n <7-m? n: n + 1))
làm xong

http://ideone.com/XrZO7

Ý tưởng chính là để chọn một số ngẫu nhiên trong [1, x] không bằng y, bạn có thể chọn một số ngẫu nhiên trong [1, x-1] và sau đó tăng nếu nó> = y. Đối với vấn đề này, chúng tôi muốn một số ngẫu nhiên trong [1,6] không bằng f hoặc 7-f. Chúng ta phải thực hiện hai bài kiểm tra theo thứ tự min (f, 7-f), max (f, 7-f).

Giả sử một môi trường trống ban đầu có thể lưu 2 ký tự bằng cách không khởi tạo i và thay đổi điều kiện vòng lặp thành i++<10


2

Bash: 97 94 92 90 89 87

Chơi golf nặng nề từ câu trả lời của Aman ZeeK Verma:

cho ((i = 10, f = 0; i -;)) làm
cho ((n = f; n == f || n + f == 7; f = RANDOM% 6 + 1)) làm:
làm xong
in $ f
làm xong

http://ideone.com/QiuTx

NB cho rằng nó có thể bị thu hẹp bởi 5 ký tự bằng cách thay đổi dòng đầu tiên thành for((;i++<10;))nhưng điều đó đưa ra các giả định không phải lúc nào cũng hợp lệ. Nó sẽ hoạt động tốt trong ideone nhưng ai đó chạy nó từ shell có thể có ihoặc fxuất sang thứ khác không.


Tôi muốn làm một phiên bản không có vòng lặp bên trong, nhưng tôi sợ nó sẽ dài hơn.
Peter Taylor

Điều này là vô cùng tuyệt vời, tôi đoán là quá thô
thiển

@Aman, hầu hết không phải là bash cụ thể. Đó chỉ là vài chục sàng lọc với các bài kiểm tra sau mỗi lần kiểm tra và đảo ngược khi tôi phá vỡ thứ gì đó. Bit duy nhất thực sự là một mánh khóe bash là noop, cái mà tôi phải tìm kiếm. Nếu bạn có thời gian để đọc man bash, tôi khuyên bạn nên đọc nó. Tôi đã từng đọc nó để che, và chỉ có một ý tưởng mơ hồ về những gì có thể và đáng để tìm kiếm đã phục vụ tốt cho tôi.
Peter Taylor

2

Windows PowerShell, 45

-join(0..9|%{($d=1..6-ne(7-$d)-ne$d|random)})

Khá tầm thường, thực sự. Tôi tạo một danh sách các cuộn xúc xắc có thể 1..6và sau đó chỉ chọn những cuộn không bằng bảy trừ cuộn cuối cùng và sau đó chỉ những cuộn không bằng cuộn cuối cùng. Từ danh sách còn lại, sau đó tôi chọn một mục ngẫu nhiên và gán nó vào $d. Vì $dban đầu được xử lý vì 0nó lăn một cái chết bình thường lần đầu tiên.

Kịch bản thử nghiệm:

for($i=0;$i-lt20;$i++){
    $o=@(./tipping.ps1)
    if ($i-gt0-and$o-eq$o2) { throw "Must have random output" }
    if ($o.count-ne1) { throw "Must only have one line of output" }
    if ($o[0]-match'[^1-6]'){ throw "Invalid characters" }
    if($o[0].length-ne10){ throw "Wrong length: $($o[0].length)" }
    $r=[char[]]($o[0])|%{$_-48}
    for ($x=1;$x-lt$r.count;$x++){
        if ($r[$x-1]+$r[$x]-eq7) { throw "Not a tipping: $($r[$x-1]) and $($r[$x])" }
    }
    $o2=$o
}

Lịch sử:

  • 2011/02/18 11:57 (61) Nỗ lực đầu tiên.
  • 2011/02/18 11:58 (45) Tôi không cần tạo số đầu tiên một cách riêng biệt.

Tôi nhận đượcThe term 'random' is not recognized as a cmdlet, function, operable program, or script file. Verify the term and try again.
Peter Taylor

@Peter: PowerShell v2, làm ơn. Các Get-Randomlệnh không tồn tại trong v1.
Joey

2

J

Điều này sẽ hoạt động nhưng không may, trình tạo ngẫu nhiên của J bị kẹt sau lần lặp thứ 3:

a=:>:i.6
f=:a#~1-(+&(a=])7&-)
((,(?4)&{@f@(_1&{))^:9)>:?6

6 4 5 4 5 4 5 4 5 4


Tôi không phải là một chuyên gia về J, nhưng dường như tôi từ những gì tôi phải chịu khi soạn câu trả lời J của tôi cho chủ đề này (?4)có xu hướng được cuộn một lần và được coi là một hằng số cho các lần lặp lại tiếp theo nếu bạn không cẩn thận với nó. Tôi đã làm việc xung quanh nó bằng cách sử dụng một (?@4:)cấu trúc giống như.
JB

2

Hồng ngọc

66 ký tự

(0..9).reduce([]){|m|m<<((1..6).to_a-[d=m[-1]||0,7-d]).shuffle[0]}

2

J, 30 ký tự

>:(?@4:{(i.6)-.],5&-)^:(<10)?6

6 2 3 5 4 2 4 1 3 6

Giải thích (đọc từ phải sang trái):

  • ?6 trả về một số ngẫu nhiên từ 0 đến 5
  • ^:(<10)áp dụng một chức năng 9 lần, tích lũy kết quả trên đường đi. Chức năng là:
  • ?@4:{(i.6)-.],5&-
    • ] , 5&- trả về một mảng của số đầu vào và phần bù của nó thành 5 (hiện chúng tôi đang xử lý các số dựa trên 0, vì vậy tổng các mặt đối diện là 5)
    • (i. 6) -. xóa chúng khỏi bộ số nguyên 0 đến 5. Chúng tôi còn lại tất cả các vị trí hợp lệ sau một thao tác lật từ vị trí đầu vào.
    • ?@4: { chọn một trong số đó một cách ngẫu nhiên
  • >: tăng toàn bộ chuỗi để đưa các số liệu trở lại khoảng 1 đến 6.

Nice nghĩ đến ">:" sau đó kết thúc.
Eelvex

1
@Eelvex Tôi không biết tại sao súc sắc trong thế giới thực là 1 đến 6 khi tất cả các lý do hợp lý về chúng sử dụng 0 đến 5 .: D
JB

2

GS2, 16 byte

16 2f 25 08 41 20 17 30 16 2f 31 31 25 09 19 32

Đây là cách nó hoạt động

16 2f 25     # make range from 1 to 6 and push random element
08           # start block
    41       # duplicate top of stack twice
    20 17 30 # negate top of stack and add 7
    16 2f    # push range from 1 to 6
    31 31    # do set-wise difference with each of the two previous numbers
    25       # push a random element from the list
09           # end block
19 32        # repeat block 9 times

Tôi nghĩ gs2 mới hơn thử thách này.
lirtosiast

1

QBasic (71 ký tự)

Hai dòng mới là cần thiết và được bao gồm trong mỗi ký tự được tính là một ký tự.

RANDOMIZE:FOR I=0TO 9
1N=INT(RND*6)+1:IF L=N OR L+N=7THEN 1
?N:L=N:NEXT

1

TI-CƠ BẢN, 38 34

For(I,1,9
Ans→X
Repeat Ans≠X and Ans≠7-X
randInt(1,6
End
Disp Ans
End

Giải pháp nhàm chán, nhưng nó ngắn hơn phiên bản trước. Tôi tận dụng thực tế là trên một máy tính mới, Ansđược khởi tạo về không.


Tôi không biết nếu có thể, nhưng tôi sẽ cung cấp 50 đại diện cho bất kỳ ai có thể tìm ra giải pháp ngắn hơn.
lirtosiast

Bạn tính 34 thế nào?
đệ quy

Mỗi mã thông báo ở đây là một byte trong bộ nhớ ; TI-BASIC là tiêu chuẩn để được ghi điểm theo cách này. Nếu bạn có máy tính, hãy nhập chương trình, nhìn vào màn hình quản lý bộ nhớ, sau đó trừ 9 và trừ độ dài của tên chương trình để lấy kích thước mã.
lirtosiast

1

Java 8, 130 byte

v->{int d=(int)(Math.random()*6+1),i=10,p;String r=""+d;for(;i-->0;r+=d)for(p=d;p==d|p+d==7;d=(int)(Math.random()*6+1));return r;}

Hãy thử nó ở đây.

Là chương trình đầy đủ với phương thức chính dài dòng, thay vào đó sẽ là 178 byte :

interface M{static void main(String[]a){int d=(int)(Math.random()*6+1),i=10,p;String r=""+d;for(;i-->0;r+=d)for(p=d;p==d|p+d==7;d=(int)(Math.random()*6+1));System.out.print(r);}}

Hãy thử nó ở đây.

Semi-port của câu trả lời Bash của @AmanZeeKVerma .

Giải trình:

 v->{              // Method with empty unused parameter and String return-type
   int d=(int)(Math.random()*6+1),
                   //  Random dice-roll 1-6
       i=10,       //  Counter-integer, starting at 10
       p;          //  Temp integer to store new side
   String r=""+d;  //  Result-String, starting at the first dice-roll
   for(;i-->0;     //  Loop (1) 10 times:
       r+=d)       //    After every iteration, append the result with a random side
     for(p=d;      //   Set the new side to the current side
         p==d      //   Loop (2) as long as the new side and current side are the same
         |p+d==7;  //   or as long as both combined are exactly 7:
       d=(int)(Math.random()*6+1)
                   //    Set the new side to a random side 1-6
     );            //   End of loop (2)
                   //  End of loop (1) (implicit / single-line body)
  return r;        //  Return the result-String
}                  // End of method


0

> <> , 71 byte

Tôi rất vui vì tôi có thể giới thiệu xngẫu nhiên con trỏ mã của <> khi tôi không nhớ là đã thấy nó ở đây.

a&0 v
 /2v
1x3v 
>x< <<
6x4v
 \5v ~
:{:/ ^?=}
:{:/ ^?=7+}
:~$<^&;!?:-1&n

Bạn có thể thử nó trên trình thông dịch trực tuyến này (dán mã, gửi, bắt đầu).


Bạn sẽ nhận được upvote của tôi khi bạn sửa giải pháp.
lirtosiast

@ThomasKwa Xong, tôi có thể đánh golf xuống một chút nhưng ít nhất bây giờ nó đã hoạt động.
Aaron

0

R , 67 byte

c(3,5,1,4,2,6)[(sample(1:6,1)+cumsum(sample((-2:2)[-3],9,T)))%%6+1]

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

một câu trả lời golfier R nhưng điều này tôi nghĩ là một cách tiếp cận khác với các câu trả lời được gửi cho đến nay.

c(3,5,1,4,2,6)                                                     #A dice and its facets
               (sample(1:6,1)                                      #Initial dice roll
                             +cumsum(sample((-2:2)[-3],9,T)))      #9 tippings in c(-2,-1,1,2)
                                                             %%6+1 #converts to values in [0,6]
              [                                                   ]#

0

05AB1E , 23 byte

6LΩUTFX?6LʒDXÊsX+7Ê*}ΩU

Chắc chắn có thể chơi gôn, nhưng hiện tại tôi không thấy nó ..

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

Giải trình:

6LΩ              # Pick a random value from the range [1,6]
                 #  i.e. [1,2,3,4,5,6] → 3
   U             # Save this random value in variable `X`
TF               # Loop 10 times:
  X?             #  Print `X` without newline to STDOUT
  6Lʒ     }      #  Create a range [1,6] again, and filter it by:
     DXÊ         #   Check if the current value is not equal to `X`
                 #    i.e. 1 and 3 → 1 (truthy)
                 #    i.e. 3 and 3 → 0 (falsey)
     sX+         #   Sum the current value with `X`
                 #    i.e. 1 and 3 → 4
                 #    i.e. 3 and 3 → 6
        7Ê       #   And check if it's not equal to 7
                 #    i.e. 4 and 7 → 1 (truthy)
                 #    i.e. 6 and 7 → 1 (truthy)
     *           #   If both checks are truthy, keep it in the filtered list
                 #    i.e. 1 and 1 → 1 (truthy)
                 #    i.e. 0 and 1 → 0 (falsey)
           Ω     #  Pick a random value from the filtered list
                 #   i.e. [1,2,5,6] → 1
            U    #  And save it in variable `X` for the next iteration of the loop
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.