การทอยลูกเต๋าแบบสุ่ม


14

ในลูกเต๋ามาตรฐาน (ตาย) ตัวเลขจะถูกจัดเรียงเพื่อให้ใบหน้าตรงข้ามเพิ่มเป็นเจ็ด เขียนโปรแกรมสั้นที่สุดเท่าที่จะเป็นไปได้ในภาษาที่คุณต้องการซึ่งจะให้ผลแบบสุ่มตามด้วยการสุ่ม 9 ครั้ง การให้ทิปคือการหมุนหนึ่งในสี่ของลูกเต๋าเช่นหากลูกเต๋าหันหน้าไปทาง 5 การเอียงที่เป็นไปได้ทั้งหมดคือ 1,3,4 และ 6

ตัวอย่างผลลัพธ์ที่ต้องการ:

1532131356

คำตอบ:


5

GolfScript, 26 ตัวอักษร

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

รุ่นที่บีบอัดมากกว่าเล็กน้อยของJoeyโดยทั่วไปแล้วจะแก้ไขปัญหาโดยไม่มีการทำดัชนี


9

ทับทิม, 44

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

ฉันพบเคล็ดลับ [* 1..6] โดยการทดลองที่โชคดี


1
มีเทคนิคที่ดีที่นี่สิ่งที่ดี กดปุ่มบนศีรษะเพื่อหาวิธี # Array # ที่หายไป
ลาร์ส Haugseth

4

จาวาสคริปต์ (71 ตัวอักษร)

คุณอาจต้องแทนที่printด้วยalertหรืออย่างอื่นขึ้นอยู่กับสภาพแวดล้อม JavaScript ของคุณ

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

ผสานลูปโดยการเพิ่มค่าภายนอกโดยมีเงื่อนไขเมื่อพบค่า: สำหรับ (b = n = 10; n; ab && a + b-7 && พิมพ์ (b = a, n -)) a = Math.random () * 6 + 1 | 0
imma


3

ทุบตี

#/!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

รหัสตัวอย่าง: http://ideone.com/CCfro


การใช้งาน((var=expression))เป็นสิ่งที่ดีมาก - ฉันคิดว่าวิธีที่สั้นที่สุดคือvar=$((expression))แต่ทำไมคุณถึงใช้มันเพียงครั้งเดียวและเสียตัวละครจำนวนมากใน expr ใน backticks?
Peter Taylor

ฉันไม่ได้ทำสคริปต์เชลล์มากนัก แต่ด้วยเหตุผลบางอย่าง ((var = expr)) ในบางสถานที่ล้มเหลว (ใช่แปลก: P) ตั้งแต่ฉันเริ่มต้นสคริปต์นี้ฉันก็เพิ่งจะเสร็จสมบูรณ์ :)
Aman ZeeK Verma

3

R, 56 52

for(i in 0:9)cat(F<-sample(setdiff(1:6,c(F,7-F)),1))


@ JayCe ความคิดที่ดีขอบคุณสำหรับการชี้ให้เห็น!
Sven Hohenstein

ความสุขของฉัน - และที่จริงคุณสามารถประหยัดได้อีก 5 ไบต์
JayCe

2

Bash ที่มีวงเดียว: 100 99 98 96

สำหรับ ((i = 10, f = RANDOM% 6 + 1; I -;)) ทำ
printf $ f
((n = RANDOM% 4 + 1, ม. f = <4 f: 7-F, f = n <ม. || ++ n <7 เมตร n: n + 1))
เสร็จแล้ว

http://ideone.com/XrZO7

แนวคิดหลักคือการเลือกหมายเลขสุ่มใน [1, x] ซึ่งไม่เท่ากับ y คุณสามารถเลือกหมายเลขสุ่มใน [1, x-1] แล้วเพิ่มขึ้นถ้ามัน> = y สำหรับปัญหานี้เราต้องการตัวเลขสุ่มใน [1,6] ซึ่งไม่เท่ากับ f หรือ 7-f เราต้องทำการทดสอบสองครั้งตามลำดับขั้นต่ำ (f, 7-f), สูงสุด (f, 7-f)

สมมติว่าสภาพแวดล้อมที่ว่างเปล่าเริ่มแรกสามารถบันทึก 2 ตัวอักษรโดยไม่เริ่มต้นฉันและเปลี่ยนเงื่อนไขการวนรอบเป็น i++<10


2

Bash: 97 94 92 90 89 87

ตีกอล์ฟอย่างหนักจากคำตอบของ Aman ZeeK Verma:

สำหรับ ((i = 10, F = 0; I -;)) ทำ
สำหรับ ((n = f; n == f || n + f == 7; f = RANDOM% 6 + 1)) ทำ:
เสร็จแล้ว
printf $ f
เสร็จแล้ว

http://ideone.com/QiuTx

NB เนื้อหาสามารถลดขนาดได้ถึง 5 ตัวอักษรโดยเปลี่ยนบรรทัดแรกเป็นfor((;i++<10;))แต่จะทำให้สมมติฐานที่ไม่ถูกต้องเสมอไป มันจะทำงานได้ดีใน ideone แต่ใครบางคนที่เรียกใช้จากเชลล์อาจมีiหรือfส่งออกไปยังบางสิ่งที่ไม่ใช่ศูนย์


ฉันต้องการทำรุ่นที่ไม่มีลูปด้านใน แต่ฉันกลัวว่ามันจะนานกว่านี้
Peter Taylor

นี่มันสุดยอดมากฉันดิบเกินไปสำหรับการทุบตีฉันเดา :)
Aman ZeeK Verma

@Aman ส่วนใหญ่จะไม่เฉพาะทุบตี มันเป็นแค่การปรับแต่งหลายสิบครั้งด้วยการทดสอบแต่ละครั้งและการพลิกกลับเมื่อฉันทำอะไรบางอย่าง บิตเดียวซึ่งเป็นเคล็ดลับทุบตีจริงๆคือ noop ซึ่งฉันต้องค้นหา ถ้าคุณมีเวลาอ่านman bashฉันแนะนำ ฉันเคยอ่านมันครอบคลุมเพื่อครอบคลุมและเพียงแค่มีความคิดที่คลุมเครือในสิ่งที่เป็นไปได้และคุ้มค่าการค้นหาได้ทำหน้าที่ฉันดี
Peter Taylor

2

Windows PowerShell, 45

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

ค่อนข้างน่าสนใจจริง ๆ ฉันสร้างรายการของการทอยลูกเต๋าที่เป็นไปได้1..6จากนั้นเลือกเฉพาะผู้ที่ไม่เท่ากับเจ็ดลบการหมุนครั้งสุดท้ายแล้วเลือกเฉพาะผู้ที่ไม่เท่ากับม้วนสุดท้าย $dจากรายการที่เหลือจากนั้นผมก็เลือกไอเทมสุ่มและกำหนดให้ เนื่องจาก$dได้รับการรักษาครั้งแรกในขณะที่0มันม้วนตายปกติในครั้งแรก

สคริปต์ทดสอบ:

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
}

ประวัติความเป็นมา:

  • 2011-02-18 11:57 (61) ความพยายามครั้งแรก
  • 2011-02-18 11:58 (45) ฉันไม่จำเป็นต้องสร้างหมายเลขแรกแยกกัน

ฉันได้รับThe 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 ได้โปรด Get-Randomcmdlet ไม่ได้อยู่ใน v1
Joey

2

J

สิ่งนี้ควรใช้งานได้ แต่ตัวสร้างแบบสุ่มของ J น่าจะติดอยู่หลังจากการทำซ้ำครั้งที่ 3:

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

6 4 5 4 5 4 5 4 5 4


ฉันไม่ได้เป็นผู้เชี่ยวชาญ J แต่ดูเหมือนว่าจากสิ่งที่ฉันได้รับความเดือดร้อนในการเขียนคำตอบ J ของฉันในหัวข้อนี้ที่(?4)มีแนวโน้มที่จะถูกรีดครั้งเดียวและถือว่าเป็นค่าคงที่สำหรับการทำซ้ำในภายหลังหากคุณไม่ระวัง ฉันทำงานโดยใช้โครงสร้าง(?@4:)คล้ายกัน
JB


2

J, 30 ตัวอักษร

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

6 2 3 5 4 2 4 1 3 6

คำอธิบาย (อ่านจากขวาไปซ้าย):

  • ?6 ส่งคืนตัวเลขสุ่มระหว่าง 0 ถึง 5
  • ^:(<10)ใช้ฟังก์ชั่น 9 ครั้งสะสมผลลัพธ์ตลอดเส้นทาง ฟังก์ชั่นคือ:
  • ?@4:{(i.6)-.],5&-
    • ] , 5&- ส่งคืนอาร์เรย์ของหมายเลขอินพุทและส่วนประกอบของมันถึง 5 (ขณะนี้เรากำลังจัดการกับตัวเลขที่เป็น 0 ดังนั้นผลรวมของใบหน้าที่ตรงกันข้ามคือ 5)
    • (i. 6) -. ลบออกจากชุดเต็มของจำนวนเต็ม 0 ถึง 5 เราจะเหลือตำแหน่งที่ถูกต้องทั้งหมดหลังจากการดำเนินการให้ทิปครั้งเดียวจากตำแหน่งอินพุต
    • ?@4: { เลือกหนึ่งในนั้นโดยการสุ่ม
  • >: เพิ่มลำดับทั้งหมดเพื่อนำตัวเลขกลับไปที่ช่วงเวลา 1 ถึง 6

ยินดีที่จะ ">:" ในตอนท้าย
Eelvex

1
@Elex ฉันไม่รู้ว่าทำไมลูกเต๋าในโลกแห่งความเป็นจริงถึง 1 ถึง 6 เมื่อเหตุผลที่สมเหตุสมผลเกี่ยวกับพวกเขาใช้ 0 ถึง 5: D
JB

2

GS2, 16 ไบต์

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

นี่คือวิธีการทำงาน

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

ฉันคิดว่า gs2 ใหม่กว่าความท้าทายนี้
lirtosiast

1

QBasic (71 ตัวอักษร)

The two newlines are necessary and included in the character count as one character each.

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

1

TI-BASIC, 38 34

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

Boring solution, but it's shorter than the previous revision. I take advantage of the fact that on a fresh calculator, Ans is initialized to zero.


I don't know if it's possible, but I'll give 50 rep to anyone who can find a shorter solution.
lirtosiast

คุณคำนวณ 34 อย่างไร
เรียกซ้ำ

โทเค็นแต่ละที่นี่เป็นหนึ่งไบต์ในหน่วยความจำ ; เป็นมาตรฐานสำหรับ TI-BASIC ที่จะทำคะแนนในลักษณะนี้ หากคุณมีเครื่องคิดเลขให้พิมพ์โปรแกรมเข้าดูที่หน้าจอการจัดการหน่วยความจำจากนั้นลบ 9 แล้วลบความยาวของชื่อโปรแกรมออกเพื่อให้ได้ขนาดรหัส
lirtosiast

1

Java 8, 130 ไบต์

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

ลองที่นี่

เป็นโปรแกรมเต็มรูปแบบด้วยวิธีหลัก verbose นี้จะเป็น178 ไบต์แทน:

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

ลองที่นี่

กึ่งท่าเรือ@AmanZeeKVerma 'คำตอบทุบตี

คำอธิบาย:

 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 bytes

I'm glad I could showcase ><>'s x code-pointer randomization as I don't recall seeing it here.

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

You can try it on this online interpreter (paste code, submit, start).


You'll get my upvote once you fix the solution.
lirtosiast

@ThomasKwa Done, I might be able to golf it down a little bit but at least it's now functional.
Aaron

0

R, 67 bytes

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

Try it online!

There is a golfier R answer but this I think is a different approach from the answers submitted so far.

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 ไบต์

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

สามารถเล่นกอล์ฟได้ แต่ตอนนี้ฉันไม่เห็นมัน ..

ลองออนไลน์

คำอธิบาย:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.