非传递性骰子游戏


10

那些喜欢Numberphile的人会熟悉James Grime博士,他在他的频道上描述了一种非过渡性的骰子游戏

游戏包含三个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。

写一个程序服用123作为输入。这表示用户选择的骰子。然后,程序选择可以击败用户的骰子,并输出21卷的结果,“ Computer/User wins with x points

规则

  • 代名词高尔夫,以决胜局形式投票
  • 您必须使用RNG(或类似工具)来实际模拟骰子掷骰。
  • 我对输出格式不太严格。只要显示骰子就可以,以某种方式在21卷之间分开(与在同一卷中分开骰子的方式不同),并在上面输出该句子。
  • 输入可以是标准输入,命令行自变量,来自屏幕等。

输入值

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并击败他。

Answers:


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×XZ是计算机的分数,因此如果计算机赢得了显示Z,则显示21-Z

分数不是总分的差(所有骰子对预期为0),而是21个掷骰的获胜者获得1分。在示例中,用户获得5分(赢得5个掷骰:4-6、1-3、1-3、1-3、4-6),计算机得到16分的休息。
TwiNight

@TwiNight:固定它
马里努斯

用户获胜时的负分。您可以解决|Z-21×X不会更改字符数的问题
TwiNight

2

R-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.factortable,节省9个字符。
Brian Diggs 2014年

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是的,我在测试时丢失了它。我做了一个快速修正,只是为了保持球的运转。稍后我会考虑如何改进它。
belisarius博士13年

现在看来一切正常。
DavidC

@dude现在好多了
belisarius博士13年

非常好。+1
巫师先生

1

Ruby 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 获取输入的ascii值(仅适用于红宝石1.8),它的整数值很容易模3。

s从21开始,因此s.times{code}将执行code21次并返回21。在每次迭代中,循环会根据谁获胜而从s中减去1,因此我们可以通过查看是否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

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

从标准输入中读取用户的选择。


一些提示:for(c=51-getchar(p=0);printf("%ser wins),重新排列表达式的r开头(并节省空间。
ugoren 2013年

以及更多:(c+1)%3-> -~c%3,使其为p静态(初始化为0),{}在其后删除for;-> ,在其中),在其中使用p<11?:两次printf而不是分配p,q
ugoren

您可以s,q在loop中进行设置printf,然后再增加p,从而节省括号。还可以将c分配更改为使用%3%7,并赋予不同的顺序0,1,2。
ugoren 2013年

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 ;

是的,Factor并不是打高尔夫球时要使用的语言,但这很好。


0

Python 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")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.