Simulasikan gim Craps

18

Craps adalah permainan dadu yang cukup sederhana yang sering dimainkan di kasino. Bahkan jika Anda bukan penjudi (yang bukan saya), itu masih merupakan permainan yang cukup menarik. Inilah aturannya:

Pada awal permainan Craps ada apa yang disebut putaran keluar . Pemain menggulung dua d6 (enam sisi die) dan dua gulungan mati ditambahkan. Jika hasilnya 7 atau 11, orang tersebut secara otomatis menang (ini dikenal sebagai alami ). Jika hasilnya adalah 2, 3 atau 12 orang tersebut secara otomatis kehilangan (ini dikenal sebagai crapping out ). Kalau tidak, hasilnya ditetapkan sebagai titik untuk putaran poin.

Setelah ini, babak point dimulai. Selama putaran poin, pemain harus terus menerus menggulung 2 d6s sampai orang tersebut menggulung 7 atau poinnya dari babak sebelumnya. Jika orang tersebut memutar angka 7, mereka kalah. Jika mereka menggulung poin mereka, mereka menang.

Tantangan

Terapkan program sederhana yang mensimulasikan permainan dadu. Jika orang tersebut menggulirkan permainan alami atau omong kosong selama putaran keluar, program harus menampilkan "Alami:" atau "Menghancurkan:" diikuti oleh die-roll dan kemudian keluar. Kalau tidak, itu akan menampilkan "Point:" diikuti oleh titik. Kemudian, selama putaran poin, harus menghasilkan setiap die-roll sampai angka 7 atau poin tercapai. Jika orang tersebut menang, maka ia harus dikeluarkan "Pass"; jika mereka kehilangan itu harus keluar "Don't Pass".

Implementasi Referensi

Groovy, 277 byte

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

Cobalah online.

Output sampel

Natural: 7

Crapping out: 3

Point: 9
4
8
11
9
Pass

dan

Point: 5
3
7
Don't Pass

Ini , jadi kode terpendek menang.

(PERNYATAAN: Tantangan ini tidak dimaksudkan untuk mempromosikan perjudian dengan cara apa pun. Ingat, rumah selalu menang.)

sebuah spaghetto
sumber
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.- Bagaimana dengan memilih nilai acak dalam [1, 12] dari distribusi yang identik dengan menambahkan dua nilai acak seragam dalam [1, 6]?
Mego
@Mego Whoa, tantangan lama. Ya itu akan baik-baik saja. Saya pikir peringatan itu kebanyakan hanya untuk memastikan orang-orang menyadari bahwa distribusi seragam antara [1, 12] tidak sama dengan 2d6. Saya akan menulis ulang sedikit.
spaghetto

Jawaban:

6

Ruby 164

Cukup mudah. Fitur menarik:

Kasus crapping out dirangkum sebagai r%12<4dan kasus natural yang tersisa diringkas sebagai r%4==3.

String awal disimpan di cdan gulungan lebih lanjut diambil hanya jika ini lebih baru secara alfabet dari satu huruf ?P(yang hanya terjadi untuk 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")
Level River St
sumber
Sukai cara Anda memeriksa sisanya, bukan untuk 2,3,7,11 atau 12 secara terpisah!
Jeroen
6

Python 3, 190 byte

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])

Ini berdasarkan jawaban Celeo ; Saya mengganti beberapa persyaratan panjang dengan angka ajaib yang mengkodekan LUT untuk setiap angka, menggunakan variabel, dan melakukan beberapa golf lain-lain. Masih ada ruang untuk bermain golf; mungkin di bawah 170.

Saya tidak mencoba menggunakan Python 2, jadi saya tidak tahu apakah akan lebih pendek.

lirtosiast
sumber
1
Peduli untuk menjelaskan bagaimana Anda mendapatkan nomor ajaib itu dan bagaimana cara kerjanya?
Karl Napf
5

C99, 366 312 293 277 byte

Ini adalah posting pertama saya di sini, jadi saya akan menebak bahwa ini dapat ditingkatkan dengan banyak.

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

Versi yang Diperluas

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

Seperti yang Anda lihat, ada jumlah redundansi yang baik di sini yang kemungkinan besar bisa dihilangkan.

Kredit ke @Mego karena membantu membuat ini lebih kecil.

Chris Loonam
sumber
1
Selama kompilasi di suatu tempat, Anda baik-baik saja.
lirtosiast
@Mego terima kasih telah menunjukkan itu, yang berhasil menyingkirkan 19 byte.
Chris Loonam
Dapatkan lebih banyak menyingkirkan adan bdan juga menggunakan metode pengurangan bersama dengan operator ternary.
Chris Loonam
5

Python 2, 226 224 byte

Pass pertama dan ada banyak kode di sana:

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"

Terima kasih kepada Mego untuk 2 byte!

Celeo
sumber
Beberapa masalah dengan ini. Itu tidak mencetak "Point:" diikuti oleh nomor jika gulungan itu tidak alami atau omong kosong. Juga, harus ada ruang antara: dan nomor.
spaghetto
Aduh! Tetap tidak mencetak 'Poin: #'. Dalam output, ada spasi.
Celeo
Ah baiklah. Saya tidak menggunakan Python lagi sehingga saya tidak yakin bagaimana cara kerjanya.
spaghetto
Saya memasukkan kode Anda ke 198 di Python 3, yaitu 192 di Python 2. Apakah Anda menginginkan saran, atau haruskah saya mengirim jawaban saya sendiri?
lirtosiast
@ThomasKwa Jika Anda menempatkan banyak pekerjaan di dalamnya, posting sebagai jawaban terpisah sehingga Anda bisa mendapatkan beberapa perwakilan untuk itu.
Celeo
3

PHP 230 228 218 199 192 188 Bytes

186 byte tanpa <?

<?$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
";}

Usaha pertama di kode golf! Tidak yakin apakah menggunakan </br>akan diizinkan? Karena ini tidak akan berfungsi di konsol (sebagai baris baru). Beri tahu saya jika ini tidak diizinkan dan akan mengubah kode saya.

EDIT (16-8-16): Setelah menjadi lebih baik di codegolf saya perhatikan beberapa kemungkinan perbaikan Ini masih berfungsi menggunakan antarmuka baris perintah. Diganti </br>dengan hard enter.

Jeroen
sumber
Natural dieja "Natural" dan bukan "Naturel".
Kritixi Lithos
Mengubahnya. Terima kasih
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)}}
pengguna902383
sumber
1

Perl 5 , 140 byte

sub d{1+int rand 6}say$"=($p=&d+&d)%12<4?"Crapping out":$p%4-3?Point:Natural,": $p";if($"gt O){say$_=&d+&d until/7|$p/;say"Don't "x/7/,Pass}

Cobalah online!

Xcali
sumber
1

PowerShell , 181 183 179 178 167 165 byte

-10 bytes berkat mazzy
-2 bytes berkat 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'}}

Cobalah online!

Versi belum dibuka:

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

Ada beberapa poin yang kurang melekat sekarang bahwa logika daftar-bangunan telah dibangun kembali menjadi sebuah saklar. Saya pikir itu masih pendekatan yang cukup baik. +2 byte memperbaiki bug.

Veskah
sumber
1
luar biasa! perpendek hingga 178 byte
mazzy
Saya pikir kondisinya -notin (7,$z)tidak relevan dengan aturan During the point round, the player must continuously roll ... the previous round. Sekarang lingkaran selesai ketika $msama dengan 7atau putaran pertama .
mazzy
1
@ Mazzy Itu adalah masalah kata dalam pertanyaan. Hanya ada dua putaran. Anda menetapkan Point hanya sekali dalam Come-outputaran dan itu adalah nomor target Anda untuk seluruh Pointputaran. The previous roundmengacu pada Come-outputaran
Veskah
1
Terima kasih. 168 byte
mazzy
2
Anda harus dapat melepas dua lagi dengan menghapus 1?dari regex craps Anda.
Xcali
0

R, 197 byte

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

Tidak disatukan

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")
}
pengguna5957401
sumber
0

Pyth , 108 byte

p|K?}J+OS6OS6,7 11"Natural"?}J[2 3 12)"Crapping out"k"Point"+": "JI!KW!}Z,7JIq7=Z
+OS6OS6=K"Don't "))+K"Pass

Cobalah online!

Pass pertama, mungkin bisa menemukan sedikit penghematan.

Sok
sumber
0

Pesona Rise , 151 byte

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"\

Cobalah online!

Setelah memperbaiki bug mengenai angka acak (itu re-seeding setiap kali 'RAdipanggil, dan seed adalah waktu sistem, menghasilkan sejumlah besar nilai berulang) yang bekerja dengan benar.

Penjelasan

Entri ada di baris kedua, sebagai baris pertama hingga merupakan fungsi untuk menggulirkan dua dadu dan menjumlahkannya.

Alur program, dengan beberapa pengalihan tepi dan pengeritingan melengkung terbuka untuk dibaca

   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)

Hanya ada 4 instruksi NOP ( {:}≠...?\.6?) yang akan sangat sulit untuk dihapus karena ruang yang dibutuhkan pada baris lain (Yaitu panjang "Don't "string).

Draco18s
sumber