第103回

SET YOUR NUMBER

1


4


7


9

説明

ウィーキーとガルフがヒット&ブローを覚えたようです。最悪でも7回、平均で約5.8回のトライで求まります。
このアルゴリズムはGreedyに求めたものですが、多分これが一番早いと思います。
くだらない茶番を気にする必要はありません。

ルール

あなたが最初に4桁の数字を設定します。ウィーキー(左下)にはその数字がわかりません。
しかし何故かガルフ(右下)には分かっています。
ウィーキーはその数字を当てようとします。順番も合っていなければなりません。
ウィーキーが数字を宣言(トライ)すると、ガルフはそれに対してヒントを与えます。
そのヒントを頼りに何度もトライを行い、何回で当てられるかを競います。
位置は違うけれども数字が合っていればブロー(B)、位置も数字も合っていればヒット(H)といいます。
ガルフはウィーキーの宣言した数字に対してヒットとブローの個数を答えてあげます。例えば、
答えが1357のときに「0123」と宣言すると「0H2B」、
答えが0345のときに「0123」と宣言すると「1H1B」、
答えが0045のときに「0123」と宣言すると「1H0B」、
答えが3450のときに「0012」と宣言すると「0H1B」となります。
つまり一か所の数字は一回しか数えません。

このアルゴリズムの求め方

結局トライするときに宣言する数は0000〜9999の10000通りしかありません。
したがって、これらすべての数を「評価」し、最も良いものを選べばよいのです。

評価の仕方

トライすると答えが返ってきます。その答えによって、あと何通りの数が残るかが決まります。
「最悪の場合で何通りの数が残るか」によって評価をします。
例えば、最初に「0123」と宣言すると「0H0B」では1296通り、「OH1B」では3048通り、…
の答えが残り、最も多いのが「0H1B」の時の3048通りです。従って「0123」の評価値は3048となります。
これを0000から9999まで全て評価し、最も評価値の小さかったものを採用します。

最初のトライ

以上でアルゴリズムにはなっているのですが、最初にトライする数を0000〜9999まで全て考える必要はありません。
最初にトライする数は、対称性を考えると0000、0001、0011、0012、0123のみ考えればよいことになります。
これらの中で最も評価値が小さかったのはやはり0123でした。

ハッシュを作る

いちいち最善手を求めていると遅いので、あらかじめ全ての答えの出方に対する最善手を求めてあります。
それがこれです。ウィーキーはこれを見てるだけなので、時間計算量はO(1)となります。