Day 1 Task 1: クルード (Cluedo)

ブラック博士が殺害された.探偵のジルは犯人と場所と凶器を特定しなければならない.犯人の可能性のある人物は 6 人おり, 1 から 6 までの番号が付いている.場所には 10 個の可能性があり, 1 から 10 までの番号が付いている.凶器には 6 個の可能性があり,1 から 6 までの番号が付いている.

参考までに,犯人・場所・凶器の候補の名前は以下の通りである.これらの名前は課題を解くのには必要がない.
     犯人     場所     凶器
  1. プラム教授
  2. スカーレット女史
  3. マスタード大佐
  4. ホワイト夫人
  5. グリーン牧師
  6. ピーコック夫人
  1. 舞踏室
  2. 台所
  3. 温室
  4. 食堂
  5. ビリヤード室
  6. 書庫
  7. ラウンジ
  8. ホール
  9. 書斎
  10. 地下室
  1. 鉛製のパイプ
  2. 短刀
  3. 燭台
  4. リボルバー
  5. スパナ

ジルは犯人と場所と凶器のどの組合せが正しいかを繰り返し推測する. 1 回 1 回の推測を仮説 (theory) と呼ぶ.ジルは仮説を立てるたびに,助手のジャックに仮説が正しいか間違っているかを検証してもらう.ジャックの検証により仮説が正しいことが確認された場合,ジルの仕事は完了する.仮説が間違っていたことが確認された場合,ジャックはジルに「犯人が間違っている」「場所が間違っている」「凶器が間違っている」のどれかを報告する.

ジルの役割を務めるプロシージャー Solve を実装せよ.採点プログラム (grader) は Solve を何度も呼び出す. Solve が呼び出されるたびに,新しい事件に取り組むことになる. SolveTheory(M,L,W) を繰り返し呼ばなければならない. Theory(M,L,W) は採点プログラムにより実装される. M,L,W は犯人 (murderer)・場所 (location)・凶器 (weapon) の番号の組合せを表す.仮説が正しい場合, Theory(M,L,W) は 0 を返す.仮説が間違っている場合, Theory(M,L,W) は 1,2,3 のいずれかの値を返す. 1 は犯人が間違っていることを, 2 は場所が間違っていることを, 3 は凶器が間違っていることを表す. 2 個以上が間違っている場合,ジャックは間違っているもののうちどれか 1 つを選ぶが,どれを選ぶかはわからない (この選択は非決定的かもしれない). Theory(M,L,W) が 0 を返したときは Solve は終了 (return) しなければならない.

例えば,スカーレット女史 (犯人 2) が温室 (場所 3) でリボルバー (凶器 4) を用いて殺人を行ったとしよう.プロシージャー Solve が関数 Theory を次のように呼び出す場合, 2 列目のような結果が返される.

呼び出し (Call)返り値 (Returned value)説明 (Explanation)
Theory(1, 1, 1)1 または 2 または 33 つとも間違っている
Theory(3, 3, 3)1 または 3場所だけが正しい
Theory(5, 3, 4)1犯人だけが間違っている
Theory(2, 3, 4)0すべて正しい

小課題 1 (50 点)

各テスト実行では Solve が高々 100 回呼び出される. Solve が呼ばれるたびに犯人・場所・凶器の正しい組合せが変わるかもしれない. Solve が呼ばれるたびに, Theory(M,L,W) を高々 360 回呼び出すことで正しい仮説を見つけなければならない. Solve が呼び出されるたびに変数を忘れずに初期化すること.

小課題 2 (50 点)

各テスト実行では Solve が高々 100 回呼び出される. Solve が呼ばれるたびに, Theory(M,L,W) を高々 20 回呼び出すことで正しい仮説を見つけなければならない. Solve が呼び出されるたびに変数を忘れずに初期化すること.

実装の詳細