ジャック (Jack) は 2 枚のカードを,文字が見えるように表向き (face up) にひっくり返してゲームをする.25 文字それぞれについて, 2 枚の表向きにしたカードの文字が初めて一致した場合に,ジャックは母親からキャンディーをもらう.例えば,ジャックがひっくり返した 2 枚のカードが初めて両方とも M と書かれている場合は,ジャックはキャンディーをもらう.カードに書かれた文字が一致しているかどうかにかかわらず,ジャックは 2 枚のカードをひっくり返し,再び裏向きにする.手順はジャックがそれぞれの文字について1個ずつ,25 個のキャンディーを受け取るまで繰り返される.
ゲームをプレイするプロシージャー play を実装せよ.あなたの実装は採点プログラムが実装した faceup(C) を呼び出す必要がある. C は 1 以上 50 以下の数であり,あなたがひっくり返して表向きにしたい特定のカードを表す.指定するカードはその時点で表向きであってはならない. faceup(C) はカード C に書かれた文字を返す.
faceup を2回呼び出すごとに,採点プログラムは自動的に両方のカードをひっくり返し,再び裏向きにする.
あなたのプロシージャー play はジャックが 25 個全てのキャンディーを受け取った後にのみ終了して良い. faceup(C) の呼び出しはジャックが最後のキャンディーをもらった後でも許されている.
呼び出し (Call) 返り値(Returned value) 説明(Explanation) faceup(1) 'B' カード 1 には B と書かれている. faceup(7) 'X' カード 7 には X と書かれている.2 つの文字は異なっている. 採点プログラムは自動的にカード 1 とカード 7 をひっくり返し裏向きにする. faceup(7) 'X' カード 7 には X と書かれている. faceup(15) 'O' カード 15 には O と書かれている.2 つの文字は異なっている. 採点プログラムは自動的にカード 7 とカード 15 をひっくり返し裏向きにする. faceup(50) 'X' カード 50 には X と書かれている. faceup(7) 'X' カード 7 には X と書かれている.ジャックは1個目のキャンディーをもらう. 採点プログラムは自動的にカード 50 とカード 7 をひっくり返し裏向きにする. faceup(7) 'X' カード 7 には X と書かれている. faceup(50) 'X' カード 50 には X と書かれている.2 つの文字は一致しているがジャックはキャンディーをもらえない. 採点プログラムは自動的にカード 7 とカード 50 をひっくり返し裏向きにする. faceup(2) 'B' カード 2 には B と書かれている. ... (いくつかの呼び出しについて省略する) ... faceup(1) 'B' カード 1 には B と書かれている. faceup(2) 'B' カード 2 には B と書かれている. ジャックは25個目のキャンディーをもらう.
例えば,faceup(C) を常に 2*(49+48+...+2+1) = 2450 回ちょうど呼び出す単純な戦略が存在する.