レポート1 (6月10日出題)


Hit and Blowゲームで遊べるプログラムを作れ。 ルールは次の通りである。

Hit and Blowは、相手が考えた4桁の数字をヒントを元に推測する ゲームである。まず、相手は0-9の数字からなる4桁の数字を考える。 但し、
  • 0で始まってもよい。
  • 同じ数字を2度以上使ってはいけない。
という条件に従う。これに対して、こちらはなるべく少ない回数の 質問で相手の考えた数字を当てることが目的である。

一回の質問は、好きな4桁の数字(ただし上と同じ条件に従う)を言い、それに対して、

  • 考えた数字と位置も値も一致している桁の数 (Hit)
  • 位置は違うがその数字は含まれているような桁の数 (Blow)
を答えてもらうことにより行われる。例えば、4257を考えている時に 0274を言われたら、

4257
0274
-HBB

  • 0は4257に含まれていない
  • 2は値も桁も一致している (Hit)
  • 7は4257に含まれているが、位置が違う (Blow)
  • 4は4257に含まれているが、位置が違う (Blow)
なので、Hitが1つ、Blowが2つであると答えて貰う。(1Hit2Blowと言う。) 最終的に4Hit0Blowと言わせたらゲームは終了する。 2人で勝負をする場合は、お互いに数字を考えて互いに質問をしあい、 当然少ない質問回数で相手に4H0Bと言わせた方が勝ち。

コンピュータが乱数で数字を考え、人間が質問してその数字を 当てるようなプログラムを作成して欲しい。以下に、 その実行時の様子を示す。

Please input number: 0123
1H1B
Please input number: 4567
1H0B
Please input number: 8945
0H2B
Please input number: 2389
0H2B
Please input number: 4502
1H2B
Please input number: 4820
2H0B
Please input number: 9520
4H0B
Congratulation!
You found the number by 7 questions.

ヒント

とりあえず元の問題の全体の構成を考えると、 となろう。この中で難しそうな部分は、 の3つであろう。それなら、まずはこの3つの宿題を出されたと思って、 それぞれのプログラムを作成して見る。 それぞれがちゃんと動けば、それを関数とすれば、最終目的の プログラムの作成は比較的容易なはずである。

(ありえないレベルの)追加課題

Hit and Blowプログラムの「逆」をやるプログラムを考えてみよ。 つまり、人間が4桁の数を考え、コンピュータが人間に質問し、人間の考えた 数字を当てるプログラムは作れるか? 当然なるべく少ない質問回数で当てる ことを目指すこと。

締め切り

締切りは7月1日(火) 8:50 (1限開始前)。 レポートの書き方は、レポートの書き方を見て下さい。
レポート1 (6月10日出題)