크랩 스 게임 시뮬레이션


18

크랩은 카지노에서 자주 플레이되는 상당히 간단한 주사위 게임입니다. 당신이 도박꾼이 아니더라도 (나는 아닙니다), 여전히 재미있는 게임입니다. 규칙은 다음과 같습니다.

크랩 스 게임을 시작할 때 소위 라운드 아웃이 있습니다. 플레이어는 두 개의 d6 (6면 주사위)을 굴리고 두 개의 주사위 굴림이 추가됩니다. 결과가 7 또는 11이면 사람이 자동으로 이깁니다 ( 자연이라고합니다 ). 결과가 2, 3 또는 12이면 사람이 자동으로집니다 (이것은 크 래핑 아웃이라고합니다 ). 그렇지 않으면, 결과는로 설정되어있는 포인트 라운드.

그 후, 포인트 라운드가 시작됩니다. 포인트 라운드 동안 플레이어는 이전 라운드에서 7 또는 그 / 그녀의 포인트를 굴릴 때까지 2d6을 계속 굴려야합니다. 7을 굴리면집니다. 그들이 포인트를 굴리면 승리합니다.

도전

크랩 게임을 시뮬레이트하는 간단한 프로그램을 구현하십시오. 나올 라운드 중에 사람이 자연 스럽거나 쓰레기를 굴리면 프로그램은 "Natural :"또는 "Crapping out :"을 출력 한 다음 다이 롤을 출력 한 다음 종료해야합니다. 그렇지 않으면 "Point :"다음에 점이 출력됩니다. 그런 다음 포인트 라운드 동안 7 또는 포인트에 도달 할 때까지 모든 다이 롤을 출력해야합니다. 사람이 이기면 출력해야합니다 "Pass". 잃어 버리면 출력해야합니다 "Don't Pass".

참조 구현

그루비, 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, 6]에서 두 개의 균일 한 랜덤 값을 추가하는 것과 동일한 분포에서 [1, 12]에서 임의의 값을 선택하는 것은 어떻습니까?
Mego

@Mego Whoa, 오래된 도전. 그렇습니다. 경고는 대부분 사람들 이 [1, 12] 사이 의 균일 한 분포가 2d6과 동일하지 않다는 것을 깨닫게하기위한 것이라고 생각합니다 . 조금 다시 작성하겠습니다.
스파게티

답변:


6

루비 164

꽤 직설적 인. 흥미로운 기능 :

크 래핑 아웃 사례는로 요약되고 r%12<4나머지 자연 사례는로 요약됩니다 r%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를 대신하여 나머지를 확인하는 방법을 좋아하십시오!
Jeroen

6

파이썬 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 세 미만이 될 수도 있습니다.

파이썬 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, 또한 원 사업자와 함께 뺄셈 방법을 사용.
Chris Loonam

5

파이썬 2, 226224 바이트

먼저 전달하면 많은 코드가 있습니다.

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"

2 바이트의 Mego 에 감사 합니다!


이 문제는 거의 없습니다. 롤이 자연스럽지 않거나 쓰레기가 아닌 경우 "Point :"다음에 숫자가 인쇄되지 않습니다. 또한 :와 숫자 사이에 공백이 있어야합니다.
스파게티

으악! 'Point : #'를 인쇄하지 않던 문제를 수정했습니다. 출력에는 공백이 있습니다.
Celeo

그래. 더 이상 파이썬을 많이 사용하지 않으므로 어떻게 작동하는지 확실하지 않았습니다.
스파게티

파이썬 3에서 192 인 Python 3에서 198까지 코드를 골프화했습니다. 제안을 원하십니까, 아니면 나만의 답변을 게시해야합니까?
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>하드 엔터 로 교체 되었습니다.


Natural은 "Naturel"이 아닌 "Natural"로 표기됩니다.
Kritixi Lithos

그것을 바꿨다. 감사합니다
Jeroen

2

자바 스크립트 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 바이트

Xcali 덕분에 -2 바이트 는 mazzy 덕분에 -10 바이트

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. 이제 루프가 $m7거나 첫 번째 라운드 일 때 마무리 합니다.
mazzy

1
@mazzy 그것은 질문의 표현 문제입니다. 두 라운드 만 있습니다. Come-out라운드 에서 포인트를 한 번만 설정하면 전체 Point라운드 의 대상 번호입니다 . 는 previous round받는 사람을 의미 Come-out라운드
Veskah

1
감사. 168 바이트
mazzy

2
당신 1?의 쓰레기 정규식에서 를 제거하여 두 가지를 더 이륙 할 수 있어야합니다 .
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")}

언 골프

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)

{:}≠...?\.6?다른 줄에 필요한 공간 (즉, "Don't "문자열 길이)으로 인해 제거하기가 매우 어려운 NOP 명령어 ( )가 4 개뿐입니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.