【うそつきと正直者】論理クイズをプログラムする?
のぶ亭『プログラミングの相談窓口』 … 様々なプログラミング問題を個別対応致します |
【うそつきと正直者】
論理クイズをプログラムする?
問題はこちらのサイトから引用しました。
http://ameblo.jp/interesting-math/entry-10808973283.html
分かれ道…二人の道案内人
アナタは目的地に向かって歩いています。途中、分かれ道がありました。どちらにいけばいいかわかりません。しかし、そこには2人の道案内人がいました。道案内人にお金を払えば行き先を教えてもらえます。
一人は正直村の住民で、こちらの質問に対して必ず正直に答えます。もう一人はうそつき村の住民で、こちらの質問に対して必ず嘘を答えます。ただ困ったことに、どちらがどっちの村人か分かりません。更に困ったことに、アナタは1回分のお金しか持っていません。(1回しか質問できません。)更に困ったことに、YES/NOで答えるclosed questionしか質問できません。
どう尋ねたらいいの?
さてどのような質問をすれば必ず正しい道を知ることができるでしょうか??
どちらか片方の人に「こっちが正しい道ですか?」と聞いても、相手が正直者かうそつきか分かりませんので、必ず正しい答えを得られるとは限りません。
答え・・・こう尋ねればいいんだ
この場合、このように質問するとよいのです。
私があなたに「この道は正しいですか?」と質問したら、あなたは「YES」と答えますか?
この質問をすると、
相手が正直者であっても うそつきであっても、
正しい道にはYESを、
誤った道にはNOを答えてくれます。
この理由を考えてみます
- アナタが「正しい方向」を指さして、正直者に上の質問をしたとします。
すると、「正直者はあなたの『この道は正しいですか?』という質問にYESで答えるはず」なので、上の質問にはYESと答えます。 - アナタが「誤った方向」を指さして、正直者に上の質問をしたとします。
すると、「正直者はあなたの『この道は正しいですか?』という質問にNOで答えるはず」なので、上の質問にはNOと答えます。 - アナタが「正しい方向」を指さして、うそつきに上の質問をしたとします。
すると、「うそつきはあなたの『この道は正しいですか?』という質問に対して、嘘であるNOを答えるはず」ですね。しかも、「うそつきはYESで答えますか?に対して、さらに嘘をつくので」(本当はNOなんだけれども、嘘をついて)YESと答えるでしょう。 - アナタが「誤った方向」を指さして、うそつきに上の質問をしたとします。
すると、「うそつきはあなたの『この道は正しいですか?』という質問に対して、嘘であるYESを答えるはず」ですね。しかも、「うそつきはYESで答えますか?に対して、さらに嘘をつくので」(本当はYESなんだけれども、嘘をついて)NOと答えるでしょう。すなわち、この質問をすると、正しい道を指したときには必ずYESを、誤った道を指したときには必ずNOを答えるようになるのです。嘘の嘘で真になる感じですね!
ここまで読んでよく分からないと思った方へ
『私があなたに「この道は正しいですか?」と質問したら、あなたは「YES」と答えますか?』
「日本語って難しいな」と思う瞬間です。質問の内容ではなくて、「●●●」と質問したら「Yes」と答えるか?と尋ねているように感じませんか?
私自身、違和感を感じました。もし、私が正直者であっても嘘つきであっても、質問が正しく理解できないから、答えは「???」。
この問題のポイントは、『一回の質問で二人とも同じ回答を引き出す』ということです。
嘘つきの答えを否定させる条件?を考えればいいんです。という事になるので、プログラムロジック風に書いて見ました。、
つまり、こう質問しているのです。
- 正しいとき、あなたは「YES」と答えますか?
- 間違っているとき、あなたは「No」と答えますか?
この文章では、
- 正直者は、どちらも「Yes」と答え
- 嘘つきは、どちらも「No」と答えるでしょう
ということで、
『私があなたに「この道は正しいですか?」と質問したら、あなたは「YES」と答えますか?』という質問がもやもやした理由がわかりました。
それじゃ、正しい質問の仕方はどうなんだ!?ということで
嘘つきの答えだけを反転させる良い言葉(条件)をかんがえてみましたが、とうとう見つかりませんでした。
さいごに
プログラミングで、こんな問題は滅多に起こりませんし、こんな問題ができたからといって、プログラムロジックができるようになるとは思えません。
セミナー申し込みについて
12,000円/月額(月単位契約) 詳細は「セミナー教材と学習スタイル」へ
申し込み方法
下記の問い合わせフォームより必要事項と内容欄に「60日でマスターする『基礎プログラム作り』を真剣に学ぶセミナー申し込み」をご記入の上お申し込みください。お支払いまではキャンセル可。