パスワードを忘れた? アカウント作成
10273977 journal
日記

tuneoの日記: 超久しぶりにあれげメモ:3桁のHit & Blowを俺の代わりに解くプログラム

日記 by tuneo

ちょいとAndroidスマホ(というかタブレット)でゲームなんぞに手を出してしまいまして掲題のパズル?を解かないといけないのですが、いかんせん脳みそがすっかり衰えた(現役学生の頃なら余裕だったとも言えないのが悲しい)当方としては「こんなもん解いてられるか!第一、敵キャラはごりっごりにプログラムで推論してるのに、なんで俺が脳みそをすりへらさにゃならんのだ!」(答:そういうゲームだから)と、理不尽千万なことを考えて開発に着手しようと思い立った次第。

まずゲームのルールについて。このゲームは二人で遊ぶ。

1.先攻・後攻を決め、それぞれは0~9までの数字を三つ選んで一回ずつ使って3桁の数を考える。百の位が0になってもよいので「数」というとちょっと語弊があるのだが。

2.先攻側は後攻側に使っていない数字をひとつ提示してハンデを補う。

3.先攻側は後攻側の考えた数を推測して提示する。

4.後攻側は先攻側の考えた数がどれだけ自分の考えた正解に近いか、○hit, ○blowの形でヒントを出す。
hit:数字と桁が一致している。たとえば正解が314で先攻の提示した数が325だったら桁も数字も一致する3で1hit。
blow:先攻の考えた数には正解で使った数字が含まれているが、桁が違う。上記の例で、正解は同じだが先攻の提示した数が159だったら1は含まれているが桁が違うので1blowとなる。
hitとblowは同時に存在することがある。正解が314で提示された数字が415だったら、1が1hit、4が1blowで1hit, 1blowとなる。
3hitならゲーム終了。正解を提示した側の勝ち。

5.提示された数字が3hitでなければ、攻守交替で今度は後攻が先攻の考えた数を当てるために提示し、先攻はヒントを出す。以後どちらかに3hitが出るまで繰り返し。

どういうデータ構造を使うか。しょせん3桁の整数なんだからリストでもで十分なんだけど(h,j,i)とかいうリストをキーにした辞書のほうがいいのかな。うーむ、とりあえずは組んでみるか。

プログラムの流れとしては、どういう理屈でかは後で考えるとして表(or辞書)に各数の「正解っぽさ」(要は確率だな)を格納しておいて、最も高い候補を提示する(同じ確率の候補が存在した場合はランダムか、辞書順で最初か、選び方はいくつか考えられる)。それを俺がゲームのNPCに提示してお伺いを立て、hitとblowを返されたらプログラムに入力する。プログラムはこれまでに提示した候補とそれに対するhit & blowを元に、正解っぽさの表を更新して候補を提示というのを、3hitが出るまで繰り返す。

まずは絞り込みのために「こりゃサルでもわかるだろ」というケースを考える。以後簡単のためhitはh, blowはbと表記。

・3h0b(大当たり)
そのものズバリ100%でおしまい。

・0h3b(数字は三つ合ってるが並び順が違う)
組み合わせを変えて試行すればいい。勝ったも同然?三つの数字からなるそれぞれの候補は16.6%、それ以外は0%。

・0h0b(大ハズレ)
提示した三つの数字からなる六つの数(a,b,cがそれぞれ0~9の数字だとしてabc,acb,bac,bca,cab,cba)は心置きなく解の候補から除外できる。これらが正解である確率は0%。

blowとhitが入り乱れてる場合は今後の解析と検討を要する、という感じだな。
・0h1b
・0h2b
・1h0b
・1h1b
・1h2b
・2h0b
・2h1b

この議論は、tuneo (2938)によって ログインユーザだけとして作成されたが、今となっては 新たにコメントを付けることはできません。
typodupeerror

普通のやつらの下を行け -- バッドノウハウ専門家

読み込み中...