จำลองเกม Craps


18

Craps เป็นเกมลูกเต๋าที่เล่นง่ายในคาสิโน แม้ว่าคุณจะไม่ได้เป็นนักพนัน (ซึ่งฉันไม่ใช่) ก็ยังเป็นเกมที่น่าสนใจพอสมควร นี่คือกฎ:

ในช่วงเริ่มเกม Craps มีสิ่งที่เรียกว่ารอบออกมา ผู้เล่นหมุนสอง d6s (หกเหลี่ยม) และเพิ่มสองม้วน หากผลเป็น 7 หรือ 11 คนที่ชนะอัตโนมัติ (ซึ่งเป็นที่รู้จักกันเป็นธรรมชาติ ) หากผลเป็น 2, 3 หรือ 12 คนที่สูญเสียอัตโนมัติ (ซึ่งเป็นที่รู้จักกันcrapping ออก ) มิฉะนั้นผลลัพธ์จะถูกตั้งค่าเป็นจุดสำหรับรอบจุด

หลังจากนี้รอบจุดเริ่มต้น ในช่วงรอบคะแนนผู้เล่นจะต้องหมุนอย่างต่อเนื่อง 2 d6s จนกว่าผู้เล่นจะได้คะแนน 7 หรือจุดจากรอบก่อนหน้า หากบุคคลนั้นหมุนได้ 7 พวกเขาแพ้ หากพวกเขากลิ้งจุดของพวกเขาพวกเขาชนะ

ท้าทาย

ใช้โปรแกรมอย่างง่ายที่จำลองเกมการเล่นลูกเต๋าชนิดหนึ่ง หากบุคคลนั้นกลิ้งสิ่งที่เป็นธรรมชาติหรืออึออกมาในระหว่างรอบที่จะออกมาโปรแกรมควรจะส่งออก "Natural:" หรือ "Crapping out:" ตามด้วย die-roll และจากนั้นออก มิฉะนั้นควรส่งออก "Point:" ตามด้วยจุด จากนั้นในระหว่างรอบจุดมันควรจะส่งออกทุกม้วนตายจนกว่าจะถึง 7 หรือจุดที่จะถึง ถ้าคนที่ชนะก็ควรเอาท์พุท"Pass"; "Don't Pass"ถ้าพวกเขาสูญเสียมันควรเอาท์พุท

การดำเนินการอ้างอิง

Groovy ขนาด 277 ไบต์

def a={return Math.random()*6+1};int b=a()+a();(b<4||b==12)?{println"Crapping out: "+b}():{(b==7||b==11)?{println"Natural: "+b}():{println"Point: "+b;for(;;){int x=a()+a();println x;(x==7)?{println"Don't Pass";System.exit(0)}():{if(x==b){println"Pass";System.exit(0)}}()}}()}()

ลองออนไลน์

ตัวอย่างผลลัพธ์

Natural: 7

Crapping out: 3

Point: 9
4
8
11
9
Pass

และ

Point: 5
3
7
Don't Pass

นี่คือดังนั้นรหัสที่สั้นที่สุดจึงชนะ

(การปฏิเสธความรับผิด: ความท้าทายนี้ไม่ได้มีวัตถุประสงค์เพื่อส่งเสริมการพนันในทางใด ๆ โปรดจำไว้ว่าบ้านชนะเสมอ)


You can't make your program shorter by picking a random number between 1 and 12 for the die roll; it must be two numbers picked between 1 and 6.- แล้วการเลือกค่าสุ่มใน [1, 12] จากการแจกแจงที่เหมือนกับการเพิ่มค่าสุ่มสองชุดใน [1, 6]
Mego

@Mego Whoa ความท้าทายแบบเก่า ใช่ว่าจะไม่เป็นไร ฉันคิดว่าคำเตือนส่วนใหญ่เป็นเพียงเพื่อให้แน่ใจว่าผู้คนตระหนักว่าการแจกแจงแบบสม่ำเสมอระหว่าง [1, 12] นั้นไม่เหมือนกับ 2d6 ฉันจะเขียนมันอีกหน่อย
สปาเก็ตตี้

คำตอบ:


6

ทับทิม 164

ตรงไปตรงมาสวย คุณสมบัติที่น่าสนใจ:

crapping ออกกรณีที่สรุปได้และที่เหลืออีกกรณีธรรมชาติสรุปได้r%12<4r%4==3

สตริงเริ่มต้นจะถูกเก็บไว้ในcและม้วนต่อไปจะถูกนำเฉพาะในภายหลังนี้เป็นตัวอักษรในภายหลังกว่าตัวอักษรเดียว?P(ซึ่งเกิดขึ้นเพียงเพื่อPoint.)

f=->{rand(6)+rand(6)+2}
s=0
r=f[]
print c=r%12<4?'Crapping out':r%4==3?'Natural':'Point',": #{r}
"
c>?P&&(until s==r||s==7
p s=f[]end
print s==7?"Don't ":"","Pass")

รักวิธีที่คุณตรวจสอบส่วนที่เหลือแทน 2,3,7,11 หรือ 12 seperatly!
Jeroen

6

Python 3, 190 ไบต์

from random import*
r=randrange
p=print
a=r(5)+r(5)+2
c=890145//3**a%3
p(['Point:','Crapping out:','Natural:'][c],a)
if c<1:
 while 7!=c!=a:c=r(5)+r(5)+2;p(c)
 p(['Pass',"Don't pass"][c==7])

นี่คือคำตอบของ Celeo ; ฉันแทนที่เงื่อนไขที่มีความยาวด้วยหมายเลขเวทย์มนตร์ที่เข้ารหัส LUT สำหรับแต่ละหมายเลขนำตัวแปรมาใช้ซ้ำและเล่นกอล์ฟเบ็ดเตล็ดอื่น ๆ สองสามตัว ยังคงห้องกอล์ฟ อาจเป็นไปได้ที่จะได้รับต่ำกว่า 170

ฉันไม่ได้ลองใช้ Python 2 ดังนั้นฉันไม่รู้ว่ามันจะสั้นกว่านี้หรือไม่


1
สนใจที่จะอธิบายว่าคุณได้หมายเลขเวทย์มนตร์นั้นและมันทำงานอย่างไร?
Karl Napf

5

C99, 366 312 293 277 ไบต์

นี่คือโพสต์แรกของฉันที่นี่ดังนั้นฉันจะเดาว่านี่จะปรับปรุงได้มาก

#include<stdlib.h>
#include<time.h>
#define r rand()%6+1
#define p printf(
main(c,s){srand(time(0));s=r+r;int*a=s==7||s==11?"Natural:%d":2-s||3-s||12-s?0:"Crapping out:%d";if(a){p a,s);return 0;}p"Point:%d\n",c=s);do p"%d\n",s=r+r);while(7-s&&s-c);p(7-s)?"Pass":"Don't pass");}

เวอร์ชันขยาย

#include<stdlib.h>
#include<time.h>
#define r rand()%6+1
#define p printf(
main(c,s){
    srand(time(0));
    s=r+r;
    int*a=s==7||s==11?"Natural:%d":2-s||3-s||12-s?0:"Crapping out:%d";
    if(a) {p a,s);return 0;}
    p"Point:%d\n",c=s);
    do p"%d\n",s=r+r);
    while(7-s&&s-c);
    p(7-s)?"Pass":"Don't pass");
}

อย่างที่คุณเห็นมีความซ้ำซ้อนจำนวนมากที่นี่ซึ่งสามารถทำได้โดยง่าย

เครดิตให้กับ @Mego ที่ช่วยทำให้สิ่งนี้เล็กลง


1
ตราบใดที่มันรวบรวมที่ไหนสักแห่งคุณก็เป็นคนดี
lirtosiast

@Mego ขอบคุณสำหรับการชี้ให้เห็นว่ามีการจัดการเพื่อกำจัด 19 ไบต์
Chris Loonam

มีบางมากขึ้นปิดการกำจัดaและbและยังมีการใช้วิธีการลบพร้อมกับผู้ประกอบการ ternary
Chris Loonam

5

Python 2, 226 224 bytes

ผ่านครั้งแรกและมีรหัสจำนวนมาก:

from random import*
r=randrange
a=r(5)+r(5)+2
if a in[7,11]:print'Natural:',a
elif a in[2,3,12]:print'Crapping out:',a
else:
 print'Point:',a
 b=0
 while b not in[7,a]:b=r(5)+r(5)+2;print b
 print'Pass'if b-7else"Don't pass"

ขอบคุณMego 2 ไบต์!


มีปัญหาเล็กน้อยในเรื่องนี้ มันไม่ได้พิมพ์ "จุด:" ตามด้วยหมายเลขถ้าม้วนไม่ใช่ธรรมชาติหรืออึ นอกจากนี้ควรมีช่องว่างระหว่าง: และหมายเลข
ปาเก็ตตี้

อ๊ะ! คงไม่พิมพ์ 'จุด: #' ในผลลัพธ์มีช่องว่าง
Celeo

อาโอเค. ฉันไม่ได้ใช้ Python อีกต่อไปดังนั้นฉันจึงไม่แน่ใจเกี่ยวกับวิธีการทำงาน
ปาเก็ตตี้

ฉันใส่รหัสลงไปที่ 198 ใน Python 3 ซึ่งเป็น 192 ใน Python 2 คุณต้องการคำแนะนำหรือฉันควรโพสต์คำตอบของตัวเองหรือไม่?
lirtosiast

@ThomasKwa หากคุณใส่งานลงไปให้โพสต์เป็นคำตอบแยกต่างหากเพื่อให้คุณสามารถหาตัวแทนได้
Celeo

3

PHP 230 228 218 199 192 188 ไบต์

186 ไบต์ที่ไม่มี <?

<?$a=rand(1,6)+rand(1,6);$a%4==3?die("Natural: $a"):$a%12<4?die("Crapping out: $a"):print"Point: $a
";while(1){($b=rand(1,6)+rand(1,6))==7?die("Don't Pass"):$b==$a?die("Pass"):print"$b
";}

ความพยายามครั้งแรกที่รหัสกอล์ฟ! ไม่แน่ใจว่า</br>จะอนุญาตให้ใช้หรือไม่ เช่นนี้จะไม่ทำงานในคอนโซล (เป็นบรรทัดใหม่) แจ้งให้เราทราบหากไม่ได้รับอนุญาตและจะเปลี่ยนรหัสของฉัน

แก้ไข (16-8-16): หลังจากดีขึ้นที่ codegolf ฉันสังเกตเห็นการปรับปรุงที่เป็นไปได้ ยังคงใช้งานได้โดยใช้อินเตอร์เฟสบรรทัดคำสั่ง แทนที่</br>ด้วยการป้อนยาก


เป็นธรรมชาติสะกดว่า "ธรรมชาติ" และไม่ใช่ "Naturel"
Kritixi Lithos

เปลี่ยนแล้ว ขอบคุณ
Jeroen

2

Javascript 262

var r=(x=>Math.floor(Math.random()*6+1)),a=r()+r();if(a<4||a==12){alert("Crapping out: "+a)}else if(a==7||a==11){alert("Natural: "+a)}else{alert("Point: "+a);while(1){var b = r()+r();if(b==a){alert("pass");break}if(b==7){alert("dont't pass");break}alert(""+b)}}


1

PowerShell , 181 183 179 178 167 165 ไบต์

-10 ไบต์ขอบคุณ mazzy
-2 ไบต์ขอบคุณ Xcali

switch -r($z=&($x={(random 6)+(random 6)+2})){'7|11'{"Natural: $z"}'2|3'{"Crapping out: $z"}default{"Point: $z"
do{($m=&$x)}until($m-in7,$z)"Don't "*!($m-7)+'Pass'}}

ลองออนไลน์!

รุ่นที่ไม่ได้ควบคุม:

#Switch using regex on $z which is...
#&($x={...}) first assigns $x to a scriptblock then calls it, saving the return to $z
switch -r($z=&($x={(random 6)+(random 6)+2})){
    '7|11' {"Natural: $z"}
    '2|3' {"Crapping out: $z"}
    default{
        "Point: $z"

        #Call the diceroll scriptblock until you Pass,
        #while pushing each roll to output
        do{($m=&$x)}
        until($m-in7,$z)
        "Don't "*!($m-7)+'Pass'
    }
}

มีจุดที่น้อยกว่าเล็กน้อยที่ตรรกะการสร้างรายการได้ถูกสร้างขึ้นใหม่เป็นสวิตช์ ฉันคิดว่ามันยังคงเป็นวิธีที่ค่อนข้างดี +2 ไบต์แก้ไขข้อผิดพลาด


1
! น่ากลัว ย่อให้สั้นลงถึง178 ไบต์
mazzy

ผมคิดว่าอยู่ในสภาพที่ไม่เกี่ยวข้องเฉิงตูกฎ-notin (7,$z) During the point round, the player must continuously roll ... the previous roundตอนนี้การวนซ้ำจะเสร็จสิ้นเมื่อ$mเท่ากับ7หรือรอบแรก
mazzy

1
@mazzy นั่นเป็นปัญหาการใช้ถ้อยคำในคำถาม มีเพียงสองรอบ คุณตั้งค่าคะแนนเพียงครั้งเดียวในCome-outรอบและนั่นคือหมายเลขเป้าหมายของคุณสำหรับPointรอบทั้งหมด previous roundหมายถึงCome-outรอบ
Veskah

1
ขอบคุณ 168 bytes
mazzy

2
คุณควรจะสามารถถอดออกได้อีกสองครั้งโดยการลบ1?craps ของคุณออก
Xcali

0

R, 197 ไบต์

 r=sum(sample(6,2,T));if(r%%12<4)cat("Crap Out",r)else if(r%%4==3)cat("Natural",r)else{cat("Point",r);while(T){cat("",q<-sum(sample(6,2,T)));if(q==7){cat(" Don't");break};if(q>r)break};cat(" Pass")}

Ungolfed

r=sum(sample(6,2,T))
if (r%%12<4)  {
    cat("Crap Out",r) 
} else if (r%%4==3) {
    cat("Natural",r)
} else { 
    cat("Point",r)
    while (T) {
        q = sum(sample(6,2,T))
        cat("",q)
        if (q==7) {
            cat(" Don't")
            break
        }
        if (q>r) break
    }
    cat(" Pass")
}


0

เวทมนตร์รูน 151 ไบต์

R}}6'RA6'RA2++{{B͍
00B:7=S:b={+?\"Natural: "@>
pping out: "@\:2=}:3=}:c={{++?/"Cra
{:}≠   ?\ 6?;$$k\/ak$00B:$:7≠?\
"Don't "R"Pass"a/\$:$" :tnioP"\

ลองออนไลน์!

หลังจากแก้ไขข้อผิดพลาดเกี่ยวกับตัวเลขสุ่ม (มันเป็นการเพาะซ้ำทุกครั้ง 'RAมีการเรียกและเมล็ดเป็นเวลาของระบบทำให้เกิดการเรียกใช้ค่าซ้ำจำนวนมาก) ทำงานได้อย่างถูกต้อง

คำอธิบาย

รายการอยู่ในบรรทัดที่สองเนื่องจากบรรทัดแรกจนถึงจนกระทั่งเป็นฟังก์ชันสำหรับหมุนลูกเต๋าสองลูกแล้วรวมเข้าด้วยกัน

โฟลว์ของโปรแกรมพร้อมการเปลี่ยนขอบและโค้งบางอย่างที่ไม่สามารถควบคุมได้เพื่อให้อ่านได้

   R}}6'RA6'RA2++{{B͍                      Roll 2, sum, return
   >00B:7=S:b={+?\                        Entry, make first roll, compare to 7 and 11.
                  "Natural: "@            If true, print "Natural: " and the value, else go down
                 \:2=}:3=}:c={{++?/       Compare to 2, 3, and 12.
"Crapping out: "@                         If true, print "Crapping out: " and the value, else go up
                     \$:$" :tnioP"\       Print "Point: " and value (IP is travelling RTL)
                     /ak$00B:$            Print newline, roll, print
:7≠?\                                     Compare to 7
    \"Don't "R"Pass"ak$$;                 If equal, print a newline and "Don't Pass"
     {:}≠   ?\                            Else compare to initial roll.
             R"Pass"ak$$;                 If equal, print a newline and "Pass"
              6?......ak$00B              Else return to roll loop by printing a newline
                                              and rolling again (. are skipped instructions)

มีคำสั่ง NOP เพียง 4 คำเท่านั้น ( {:}≠...?\.6?) ที่ยากต่อการลบเนื่องจากพื้นที่ที่จำเป็นในบรรทัดอื่น ๆ (คือความยาวของ"Don't "สตริง)

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