전이가 아닌 주사위 게임


10

Numberphile를 좋아하는 사람들은 자신의 채널에서 전이가 아닌 주사위 게임묘사 한 James Grime 박사에게 익숙 할 것 입니다.

이 게임은 3 개의 6면 주사위로 구성됩니다 :

  • 다이 1 : 3,3,3,3,3,6
  • 다이 2 : 2,2,2,5,5,5
  • 다이 3 : 1,4,4,4,4,4

두 명의 플레이어가 각각 사용할 주사위를 선택합니다. 그들은 그들을 굴려서 더 높은 주사위가 승리합니다.

확률 적으로, 1 번 주사위는 2 번을 넘어서서> 50 % 확률로 죽습니다. 마찬가지로, 다이 2 비트는 3 다이, 그리고 흥미롭게도 다이 3 비트는 1 다이.

프로그램 복용 쓰기 1, 2또는 3입력으로합니다. 이것은 사용자가 선택한 주사위를 나타냅니다. 그런 다음 프로그램은 사용자를 이길 주사위를 선택하고 21 롤의 결과를 출력하고 " Computer/User wins with x points"

규칙

  • 코드 골프, 순위 결정으로 투표
  • 주사위 롤을 실제로 시뮬레이션하려면 RNG (또는 이와 유사한 것)를 사용해야합니다.
  • 출력 형식이 너무 엄격하지 않습니다. 오지를 보여 주면 21 개의 롤을 분리하고 (같은 롤에서 주사위를 분리하는 방법과는 다른 방식으로) 위 문장을 출력해도됩니다.
  • 입력은 stdin, 명령 행 인수, 화면 등에서 가능합니다.

입력

1

산출

4 3
4 3
4 3
4 3
4 3
4 3
4 3
4 3
4 3
4 6
1 3
4 3
4 3
1 3
4 3
1 3
4 3
4 3
4 3
4 3
4 6
 Computer wins with 16 points

여기서 사용자는 다이 1을 선택하고 롤은 오른쪽 열에 표시됩니다. 이 프로그램은 주사위 3을 선택하고 그를 때립니다.

답변:


1

GolfScript, (112) 105 자

3,21*{..+6rand<3*+)}%3/\{)\.+-1%>2<.p~<}+,,"User
Computer"n/1$11<=" wins with "+\[.~22+]$1>~+" points"+

온라인으로 실행하십시오 .

스크립트는 STDIN의 입력을 예상 한 다음 주사위 롤 (첫 번째 열 컴퓨터, 두 번째 사용자) 및 최종 통계의 결과를 STDOUT에 인쇄합니다.


4

APL ( 106 114)

'Computer' 'User'[1+X],'wins with','points',⍨|Z-21×X←11>Z←+/>/⎕←⍉↑{⍵[{?6}¨⍳21]}¨(↓5 6⍴545170074510753⊤⍨18⍴7)[⎕+⍳2]

설명:

  • (↓5 6⍴545170074510753⊤⍨18⍴7)[⎕+⍳2]: 큰 숫자는 주사위의 기본 7 표현입니다. 주사위의 값을 포함하는 6x5 행렬을 다음과 같은 순서로 만듭니다. 2 3 1 2 3. 사용자 입력을 요청하고 이것을 벡터에 추가 1 2하고 행렬에서이 선을 선택합니다. 주사위 목록이 바뀌 었으므로 이제 사용자가 선택한 것을 얻습니다 (오른쪽). 컴퓨터가 더 강한 것을 얻습니다.
  • {⍵[{?6}¨⍳21]}¨:이 두 주사위 각각에 대해 21 롤을하십시오.
  • ⎕←⍉↑: 롤을 매트릭스 형태로 놓고 출력합니다.
  • Z←+/>/: 컴퓨터의 점수를 얻습니다 (컴퓨터의 값이 사용자의 값보다 높은 횟수)
  • X←11>Z: X사용자의 승리 여부로 설정 합니다 (11이 컴퓨터 점수보다 높은 경우).
  • 'Computer' 'User'[1+X]. X사용자가 이겼는지 여부입니다.
  • 'wins with','points',⍨|Z-21×X: Z는 컴퓨터의 점수이므로 컴퓨터가 표시되면를 표시 Z하고 그렇지 않으면를 표시 21-Z합니다.

점수는 총합의 차이가 아니며 (모든 주사위 쌍에 대해 0으로 예상 됨) 대신 21 개의 롤 각각의 승자가 1 점을 얻습니다. 이 예에서 사용자는 5 점을 얻습니다 (4-6 점, 1-3 점, 1-3 점, 1-3 점, 1-3 점, 4-6 점).
TwiNight

@TwiNight : 해결
marinus

사용자가 이길 때의 부정적인 포인트. |Z-21×X문자 수를 변경하지 않는 방식으로 수정할 수 있습니다
TwiNight

2

제 228 화

d=matrix(rep(c(rep(3,5),6,2,2,2,5,5,5,1,rep(4,5)),2),6)
x=scan()
r=expand.grid(Computer=d[,x+2],User=d[,x])[sample(36,21,T),]
print(r)
s=summary.factor(names(r)[max.col(r)])
cat(names(which.max(s)),"wins with",max(s),"points\n")

예제 실행 :

> source('ntd.R')
1: 2
2: 
Read 1 item
     Computer User
28          3    5
31          3    5
36          6    5
18          6    2
11          3    2
31.1        3    5
14          3    2
8           3    2
9           3    2
17          3    2
2           3    2
29          3    5
3           3    2
16          3    2
4           3    2
21          3    5
14.1        3    2
23          3    5
16.1        3    2
17.1        3    2
19          3    5
Computer wins with 14 points

으로 대체 summary.factor하여 table9자를 저장할 수 있습니다 .
Brian Diggs

2

매쓰 208 172 166 159

명확성을 위해 추가 된 공간

b=Boole;{#, Row@{
         If[# > 10, "Play", "Comput"], "er wins with ",
         Max[#, 21 - #], " points"} &@ Total[b[#1 > #2] & @@@ #]} &@
   Table[1 + i + 3 b[6 Random[] > 2 i + 1],{21}, {i, {#, Mod[# + 1, 3]}}] &

결과는 주사위의 각 롤 값을 나열해야한다고 생각합니다.
DavidC

@dude yep, 테스트하는 동안 잃어 버렸습니다. 나는 공을 계속 달리기 위해 빨리 고쳤다. 나중에 그것을 개선하는 방법을 나중에 생각할 것입니다.
Dr. belisarius

이제는 잘 작동하는 것 같습니다.
DavidC

@dude 훨씬 나아졌습니다
Dr. belisarius

정말 좋아요 +1
Mr.Wizard

1

루비 1.8, 165

i,s,*d=getc,21,[4]*5<<1,[3]*5<<6,[2,5]*3
puts"#{s.times{p r=[i,i-1].map{|o|d[o%3][rand 6]};s+=r[0]<=>r[1]}>s?"Human":"Computer"} wins with #{[s/=2,21-s].max} points"

getc 입력의 아스키 값을 얻습니다 (루비 1.8 만 해당). 행복하게 모듈로 3을 정수 값으로 합치합니다.

s그래서, 21 밖으로 시작 s.times{code}실행됩니다 code21 번하고, 각 반복에 있는지 확인하여 원 중 하나를 추가하거나이기는 사람에 따라 s의 감산 한, 그래서 우리가 볼 수있는 루프 (21)를 반환 s지금까지 21 깔끔한 아래까지 종료를 그러나 [s/=2,21-s].max실제 포인트 수를 추출하려면 서투른 표현 이 필요합니다 . 나는의 반환 값으로 산술을하고 싶었 <=>으므로 어쨌든 행복합니다.


1

매쓰 234 247

암호

g@n_ := {t = RandomChoice[{{5, 25, 1, 5}/36 -> {{3, 1}, {3, 4}, {6, 1}, {6, 4}}, 
         {5, 1, 5, 1}/12 -> {{2, 3}, {2, 6}, {5, 3}, {5, 6}},
         {1, 1, 5, 5}/12 -> {{1, 2}, {1, 5}, {4, 2}, {4, 5}}}[[n]], 21], 
         Row[{If[(c = Count[t, {x_, y_} /; y > x]) > 10, "Computer ", "Player "], 
         "wins with ", If[c > 10, c, 21 - c], " points"}]}

용법

{플레이어 롤, 컴퓨터 롤}

g[1]
g[2]
g[3]

결과


설명

n플레이어의 주사위에 해당하는 숫자 1, 2 또는 3입니다. n은 또한 컴퓨터의 다이를 결정하지만 (동일하지는 않기 때문에) n = 1, n = 2, n = 3 일 때 주사위의 가능한 모든 롤을 생성 할 수 있습니다. 또한 각각의 확률을 결정할 수 있습니다.

다음 직후에 데이터를 검사하십시오 RandomChoice.

{5, 25, 1, 5} / 36-> {{3, 1}, {3, 4}, {6, 1}, {6, 4}}

플레이어가 주사위 1을 뽑으면 가능한 유일한 결과는 다음 4 쌍입니다.

{{3, 1}, {3, 4}, {6, 1}, {6, 4}}

이 쌍의 각각의 확률은

{5, 25, 1, 5}/36, 그건,

{5/36, 25/36, 1/36, 5/36}

RandomChoice[<data>, 21] 두 주사위의 21 롤을 출력합니다.


1

씨, 205 191

p;r(c){return 1+c+3*(rand()%6>2*c);}main(i,c,q,s){for(c=51-getchar();++i<23;printf("%u %u\n",q,s))q=r(c),p+=(s=r(-~c%3))<q;printf("%ser wins with %u points",p<11?"Comput":"Us",p<11?21-p:p);}

stdin에서 사용자의 선택을 읽습니다.


몇 가지 팁 : for(c=51-getchar(p=0);, printf("%ser wins), 표현식을 재정렬 r하여 시작 (하고 공간을 절약하십시오.
ugoren

그리고 더 : (c+1)%3-> -~c%3, p정적 (0으로 초기화 됨), {}이후 for( ;-> ,안에서 제거 ), 할당 대신 p<11?:두 번 사용하십시오 . printfp,q
ugoren

s,q루프에서 설정 하고 나중에 printf증분 p하여 괄호를 저장할 수 있습니다. 또한 변경 c사용하는 할당 %3또는 %70, 1, 2의 다른 순서를 제공합니다.
ugoren

1

인자

포함 : 388

미포함 : 300

USING: arrays formatting io kernel math math.parser prettyprint random sequences ;
IN: N
CONSTANT: d { { 3 3 3 3 3 6 } { 2 2 2 5 5 5 } { 1 4 4 4 4 4 } }
: p ( -- ) 1 read string>number [ 3 mod 1 + ] keep [ 1 - d nth ] bi@ 2array 21 iota [ drop first2 [ random ] bi@ [ 2array . ] 2keep < ] with map [ ] count [ 11 > "Comput" "Play" ? ] [ "er wins with %d points" sprintf ] bi append print ;

예, 팩터는 골프를 칠 때 실제로 사용하는 언어는 아니지만 훌륭합니다.


0

파이썬 182

from random import*
u=2+input()
r=[eval("int(choice(`0x1d67e987c0e17c9`[i%3::3])),"*21)for i in(u,u-1)]
U,C=map(sum,r)
print r,['Us','Comput'][U<C]+'er wins with %d points'%abs(U-C)

0

R 206

u=scan()
D=list(c(rep(3,5),6),c(2,5),c(1,rep(4,5)))
S=sample
U=S(D[[u]],21,T)
C=S(D[[(u+1)%%3+1]],21,T)
print(cbind(U,C))
W=sum(U>C)
I=(W>10)+1
cat(c("Computer","User")[I],"wins with",c(21-W,W)[I],"points")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.