非推移的サイコロゲーム


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

2人のプレイヤーがそれぞれ使用するダイスを選択します。彼らはそれらを転がし、より高いサイコロが何よりも勝ちます。

確率的に、ダイ1がダイ2を打つ> 50%の確率。同様に、ダイ2はダイ3を打ち、興味深いことに、ダイ3はダイ1を打ちます。

プログラムの撮影を書く12または3入力など。これは、ユーザーが選択したサイコロを示します。次に、プログラムはユーザーを倒すサイコロを選択し、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を選択し、彼を倒します。

回答:


1

GolfScript、112 105文字

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

オンラインで実行してください。

スクリプトはSTDINへの入力を想定しており、サイコロの出目(1列目のコンピューター、2番目のユーザー)と最終的な統計を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]}¨:これらの2つのサイコロのそれぞれに対して21のロールを行います。
  • ⎕←⍉↑:ロールをマトリックス形式にして出力します。
  • Z←+/>/:コンピューターのスコアを取得します(コンピューターの値がユーザーの値よりも高かった回数)
  • X←11>ZXユーザーが勝ったかどうかに設定します(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、2013年

@TwiNight:それを固定
マリナス

ユーザーが勝った場合のマイナスポイント。|Z-21×Xcharカウントを変更しないことで修正できます
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.factortable9文字を保存し、。
Brian Diggs 14

2

Mathematica 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 2013年

@dudeうん、私はテスト中にそれを失った。ボールを走らせ続けるためだけに迅速な修正を行いました。後でそれを改善する方法を考えます。
belisarius博士、2013年

現在は正常に動作しているようです。
DavidC 2013年

@dudeずっと良くなりました
belisarius博士

すごくいい。+1
Mr.Wizard 2013年

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 入力のASC​​II値を取得します(Ruby 1.8のみ)。これは喜んで3を法とする整数値に合同です。

s21から始まるので、21回s.times{code}実行してcode21を返します。ループごとに、ループはsに1を加算または減算してs勝者を決定するため、21を下回ったかどうかを確認することで誰が勝ったかを確認できます。 、しかし[s/=2,21-s].max、実際のポイント数を抽出するには、不器用な式が必要です。私は長い間、戻り値を使用して算術演算を実行したいと思っていた<=>ので、とにかく満足しています。


1

Mathematica 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] 2つのサイコロの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);}

stdinからユーザーの選択を読み取ります。


ヒント:for(c=51-getchar(p=0);printf("%ser wins)、式を並べ替えてr、最初に(スペースを節約します。
ugoren 2013年

さらに:(c+1)%3-> -~c%3p静的にする(0に初期化)、{}後に削除for;-> ,内)、p<11?:2回使用するprintfを割り当てる代わりにp,q
ugoren 2013年

そして、あなたは設定することができます s,q、ループprintfでし、p後でインクリメントしてかっこを保存できます。また、c割り当てをuse %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 ;

ええ、ファクターはゴルフをするときに使う言葉ではありませんが、素晴らしいです。


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")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.