JavaScriptで作成したHit&Blow解析器です。
色々とロジックやコーディングを調整しましたが、処理が重いです。
Pentium 2.6GHz+Firefoxでも、最初の解析には4,5秒を要します。IEだと30秒以上を要します。
正解候補数が少なくなるにつれて、応答速度が速くなっていきますので最初だけはガマンしてください。
サーバー利用型(3〜5桁)
3桁 4桁 5桁 ←ローカルPCの性能に自信がある方向け(FireFox推奨)
仮想敵
Hit&Blow解析器
攻撃用
相手の
正解候補
経過表示
相手に言う数字
相手からの回答H B
守備用
自分の
正解候補
経過表示
相手が言った数字


スマホ版はこちら

使用方法:
自分が先攻の場合:
 @左の「攻撃用」のリストから、好きな数字を選びます。
  どの数字を選んでも確率は変わりませんのでなんでもイイです。選んだ数字を敵(相手)に言います。
 A相手から「0H1B」等応答が来るので、左の「攻撃用」のプルダウンリストにxHxBを入力します。
 B相手が数字を言って攻撃してきますので、相手が言った数字を右の「守備用」に入力し、表示されたxHxBを相手に言います。

自分が後攻の場合:
 前述の、「自分が先攻の場合」の逆手順です。



解説:

攻撃時に使う数字は、左の解析器(攻撃用)から知ることが出来ます。
同様に守備時に回答するxHxBは右の解析器(守備用)から知ることが出来ます。


動作論理:

・攻撃
ゲーム開始前に於ける正解の可能性がある数字はいくつか?
千の位には10個の数字の内、1個の数字が使われます。
百の位には9個の数字の内、1個の数字が使われます。(千の位で一つ数字を使用している為)
十の位には8個。
一の位には7個となります
計算すると、10×9×8×7=5040通りの可能性がある事になります。
つまり、第一回目の攻撃時には、どの数字を選んでも問題ありません。
第一回目の攻撃時にある数字(例として1234)を言った結果、0H1Bが応答されたとします。
次に、5040個の数字の全てについて、1234と"照合"、つまりxHxBを算出します。
そんでもって、相手の応答は0H1Bですから、照合結果が0H1Bになったものだけが正解候補になります。
これを繰り返せば確実に攻撃が出来ます。


・守備
守備は攻撃の裏返しで考える必要があります。

第一回目の攻撃時に於いて、相手から応答のある可能性が有る回答は以下です。

4H0B
3H0B
2H2B
2H1B
2H0B
1H3B
1H2B
1H1B
1H0B
0H4B
0H3B
0H2B
0H1B
0H0B

もちろん、4H0Bと応答があれば、相手の正解候補は1つに絞り込まれたので試合終了(勝利)です。
では、4H0B以外の場合は相手の正解候補は、幾つに絞り込まれるのでしょうか?
以下に、それぞれの場合の絞り込まれる数を示します。

4H0B:1
3H0B:24
2H2B:6
2H1B:72
2H0B:180
1H3B:8
1H2B:216
1H1B:720
1H0B:480
0H4B:9
0H3B:264
0H2B:1260
0H1B:1440
0H0B:360

0H1Bの1440個が一番多い=絞り込まれていない。ですね。攻撃する側から見ると0H1Bは一番嬉しくない応答ですね。
逆にいうと、(初回の)守備時は0H1Bを回答すればよいのです。

と言うことで、守備時の動作論理ですが、ポイントは最初に自分の数字を決めない。と言うことです。
自分の数字は、試合開始当初は5040個です。
相手が1234と攻撃してきたとしましょう。そうしたら、5040個の数字それぞれについて"照合"、つまりxHxBを算出します。
そして、xHxB毎に集計します。(初回の守備時であれば、以下のように集計されます。数の多い順に並べています)

0H1B:1440
0H2B:1260
1H1B:720
1H0B:480
0H3B:264
1H2B:216
2H0B:180
0H0B:360
2H1B:72
3H0B:24
0H4B:9
1H3B:8
2H2B:6
4H0B:1

第一回目の守備時は0H1Bと回答します。

第二回目はどうするかと言うと、1440個の数字に対して同じような集計を繰り返して、集計数が一番多いxHxBを回答します。


攻撃用解析器と守備用解析器を互いに戦わせて見てください。理解の助けになると思います。