カイジファイナルゲームを観てきました。
そこで新作ゲームがあったので
プログラムで
検証していきたいと思います。
検証動画はこちら
さて
まずはゴールドジャンケンについてですね
この映画の内容では
政治家向けの接待ジャンケンと言う設定です。
ルールは
・3回のジャンケン勝負
・最低1回は必ずグーを出す必要がある(純金を握る)
・純金を手にして(グーの時)勝った場合、その純金はもらえる
3回勝負のうち
1回はグーを出すと言うのがポイントですね
映画では登場人物の
高倉という官僚が考えたというもので
カイジと対戦する機会があります。
その場合は
特別ルールが加算されていました。
高倉は3回の勝ちを狙っているのでした。
と言うことで
早速プログラムで検証していきたいと思います。
まずジャンケンの手は
パー・グー・チョキ・
しか無いので
その重複ありの組み合わせになります。
ただし一度はグーを出さないといけないので
パーとチョキだけのケースを除くことを考えると
27通りのうち
19ケースの組み合わせが残ります。
次にこの19ケースのみで
総当たり戦を考えてみます。
高倉に対してカイジはあいこでも負けます。
カイジが勝てるのは勝つ組み合わせの時だけです。
19ケース同士の総当たりだと
361通りの対戦パターンがあります。
ここから勝敗結果を求めていくと
カイジが1回でも勝てるケースは
361分の246ケースあります。
しかし、もう一つのポイントがあります。
ということは最後にグーを残すことは
無いだろうと思われるので
最後にグーを残してしまうケースを考えると
4ケースあります。
これを除いて考えてみることにします。
19-4で15ケースですね。
結果としては
225ケースのうち
147回はカイジが1回でも勝てるようですね。
割合としては
65%くらいの確率で
1回は勝てることになるんじゃ
なかろうかと。
そもそも
このゲームのルールだと
カイジが有利なのかもしれませんね。
2回以上勝てたケースが
有利な手順かもしれないので
それを調べてみます。
手の結果から考慮すると
というパターンで出すと
勝ちやすいのかもしれない・・・
てか
そもそも
ジャンケンに必勝法なんて
存在しないですよねーーーーーーー
カイジが
勝てたのかどうかは
カイジファイナルゲームをご覧ください
それでは
そこで新作ゲームがあったので
プログラムで
検証していきたいと思います。
検証動画はこちら
さて
まずはゴールドジャンケンについてですね
この映画の内容では
政治家向けの接待ジャンケンと言う設定です。
ルールは
・3回のジャンケン勝負
・最低1回は必ずグーを出す必要がある(純金を握る)
・純金を手にして(グーの時)勝った場合、その純金はもらえる
3回勝負のうち
1回はグーを出すと言うのがポイントですね
映画では登場人物の
高倉という官僚が考えたというもので
カイジと対戦する機会があります。
その場合は
特別ルールが加算されていました。
カイジ戦特別ルール
・カイジが1回でも勝てば勝利。
・あいこの場合、高倉の勝ち。
・純金を握って勝つごとに1億円の金塊が貰える。
高倉は3回の勝ちを狙っているのでした。
と言うことで
早速プログラムで検証していきたいと思います。
まずジャンケンの手は
パー・グー・チョキ・
しか無いので
その重複ありの組み合わせになります。
ただし一度はグーを出さないといけないので
パーとチョキだけのケースを除くことを考えると
import itertools
# 手の内
seq = ['パー','グー','チョキ']
# 出せる手を求める
# itertools.product で直積を求める
# 1度でもグーを出す必要がある
hand = [h for h in itertools.product(seq,repeat=3) if 'グー' in h]
print(len(hand))
for h in hand:
print(h)
19
('パー', 'パー', 'グー')
('パー', 'グー', 'パー')
('パー', 'グー', 'グー')
('パー', 'グー', 'チョキ')
('パー', 'チョキ', 'グー')
('グー', 'パー', 'パー')
('グー', 'パー', 'グー')
('グー', 'パー', 'チョキ')
('グー', 'グー', 'パー')
('グー', 'グー', 'グー')
('グー', 'グー', 'チョキ')
('グー', 'チョキ', 'パー')
('グー', 'チョキ', 'グー')
('グー', 'チョキ', 'チョキ')
('チョキ', 'パー', 'グー')
('チョキ', 'グー', 'パー')
('チョキ', 'グー', 'グー')
('チョキ', 'グー', 'チョキ')
('チョキ', 'チョキ', 'グー')
27通りのうち
19ケースの組み合わせが残ります。
次にこの19ケースのみで
総当たり戦を考えてみます。
高倉に対してカイジはあいこでも負けます。
カイジが勝てるのは勝つ組み合わせの時だけです。
19ケース同士の総当たりだと
361通りの対戦パターンがあります。
count=[]
for k,t in itertools.product(hand,hand):
tmp={'kaiji':0,'takakura':0}
for i in [0,1,2]:
if (k[i]=='パー' and t[i]=='グー') or (k[i]=='グー' and t[i]=='チョキ') or (k[i]=='チョキ' and t[i]=='パー'):
tmp['kaiji']+=1
else:
tmp['takakura']+=1
count.append(tmp)
print(k,t,tmp)ここから勝敗結果を求めていくと
result = {}
for c in count:
key = str(c)
if key in result:
result[key]+=1
else:
result[key]=1
for k,v in result.items():
print(k,v){'kaiji': 0, 'takakura': 3} 115
{'kaiji': 1, 'takakura': 2} 159
{'kaiji': 2, 'takakura': 1} 75
{'kaiji': 3, 'takakura': 0} 12
カイジが1回でも勝てるケースは
361分の246ケースあります。
しかし、もう一つのポイントがあります。
2手目までにグーを出していない場合は
3手目でグーを出さないといけないので
相手に負けてしまうケースが存在します。
(相手も2手目までにグーを出していなければ引き分け)
ということは最後にグーを残すことは
無いだろうと思われるので
最後にグーを残してしまうケースを考えると
hand2 = []
for h in hand:
if h[0]!='グー' and h[1]!='グー':
print(h)
else:
hand2.append(h)
('パー', 'パー', 'グー')
('パー', 'チョキ', 'グー')
('チョキ', 'パー', 'グー')
('チョキ', 'チョキ', 'グー')
4ケースあります。
これを除いて考えてみることにします。
19-4で15ケースですね。
count=[]
for k,t in itertools.product(hand2,hand2):
tmp={'kaiji':0,'takakura':0}
for i in [0,1,2]:
if (k[i]=='パー' and t[i]=='グー') or (k[i]=='グー' and t[i]=='チョキ') or (k[i]=='チョキ' and t[i]=='パー'):
tmp['kaiji']+=1
else:
tmp['takakura']+=1
count.append(tmp)
print(k,t,tmp)
result = {}
for c in count:
key = str(c)
if key in result:
result[key]+=1
else:
result[key]=1
for k,v in result.items():
print(k,v)
{'kaiji': 0, 'takakura': 3} 78
{'kaiji': 1, 'takakura': 2} 99
{'kaiji': 2, 'takakura': 1} 42
{'kaiji': 3, 'takakura': 0} 6
結果としては
225ケースのうち
147回はカイジが1回でも勝てるようですね。
割合としては
65%くらいの確率で
1回は勝てることになるんじゃ
なかろうかと。
そもそも
このゲームのルールだと
カイジが有利なのかもしれませんね。
2回以上勝てたケースが
有利な手順かもしれないので
それを調べてみます。
w = {1:{'パー':0, 'グー':0,'チョキ':0},2:{'パー':0, 'グー':0,'チョキ':0},3:{'パー':0, 'グー':0,'チョキ':0}}
for k,t in itertools.product(hand2,hand2):
tmp={'kaiji':0,'takakura':0}
for i in [0,1,2]:
if (k[i]=='パー' and t[i]=='グー') or (k[i]=='グー' and t[i]=='チョキ') or (k[i]=='チョキ' and t[i]=='パー'):
tmp['kaiji']+=1
else:
tmp['takakura']+=1
if "'kaiji': 2" in str(tmp) or "'kaiji': 3" in str(tmp):
print(k,t,tmp)
w[1][k[0]]+=1
w[2][k[1]]+=1
w[3][k[2]]+=1
print(w){1: {'パー': 15, 'グー': 27, 'チョキ': 6},
2: {'パー': 15, 'グー': 27, 'チョキ': 6},
3: {'パー': 16, 'グー': 16, 'チョキ': 16}}
手の結果から考慮すると
1手目は「パー」か「グー」
2手目は1手目「パー」なら「グー」, 1手目「グー」なら「パー」
3手目は「パー」か「チョキ」
というパターンで出すと
勝ちやすいのかもしれない・・・
てか
そもそも
ジャンケンに必勝法なんて
存在しないですよねーーーーーーー
カイジが
勝てたのかどうかは
カイジファイナルゲームをご覧ください
それでは
