3人を特定するという問題:http://blogs.wankuma.com/rti/archive/2006/09/15/38848.aspx
前回は以下の式まで説明しました。この式はややこしいので、もう一度詳しく説明します。
あっ、最初に断っておきますが、この回答が正しいかどうかは僕にはわかりません。
穴とか見つかったらじゃんじゃん突っ込んで下さい。僕も本当の解答を知りたいので^^;
j = ((r == j) == true); // j : false
r = !(!(r == r) == true); // r : true
これは「あなたはR氏ですかと聞かれたら、はいと答えますか?」の結果です。
上の式は、説明するまでも無いでしょう。
(r == j) は false なので、 (false == true) となり結果は false になります。・・・説明しちゃったw
下の式は、ちょっとややこしいですね。
!(r == r) は false なので、!(false == true) となり結果は true になります。
これを一つずつ説明して行きましょう。
!(r == r) は、「あなたはR氏ですか」と聞かれたら普通は「はい」ですが、R氏は嘘つきです。ですから「あなたはR氏ですか」と聞かれたら「いいえ」と答えることを意味します。
次の!(false == true) は、その結果、その後の「はいと答えますか?」は「いいえの回答を、はいと答えますか?」なので普通は「いいえ」ですが、R氏は嘘つきですから「はい」と答える訳です。
以上から、上記の式の(r == r)の部分の式の結果は、次の式のようになり、J氏に聞いてもR氏に聞いても、正しい回答が得られる訳です。
j = ((true) == true); // j はそのままの結果を受け取るのでtrue
r = !(!(true) == true); // r は逆の結果を受け取るので、true
ちなみに、B氏は真実を言うか、嘘を言うかわからないのですが、どちらであってもJ氏かR氏と同じ回答をする訳です。・・・と言うことは・・・何と!、3人とも同じ回答結果になる訳です!
試しに簡単な質問をしてみましょう。
「1+1=2ですかと聞かれたら、はいと答えますか?」
j = ((1 + 1 == 2) == true); // j はそのままの結果を受け取るのでtrue
r = !(!(1 + 1 == 2) == true); // r は逆の結果を受け取るので、true
b = (j, r どちらかの式と一緒); // b は、どちらの式の結果でも true
つまり、上記のような質問なら、誰に聞いても正しく答えてくれるのです。
ただし、答えは「なっ!」か「ぜ!」ですがw
さて困りました。「なっ!」か「ぜ!」、もしも「いいえ」の方で聞いちゃったら訳がわからなくなりませんか?
試しに、上記と違う2つのパターンの質問をしてみましょう。
「1+1=2ですかと聞かれたら、いいえと答えますか?」
j = ((1 + 1 == 2) == false); // j はそのままの結果を受け取るのでfalse
r = !(!(1 + 1 == 2) == false); // r は逆の結果を受け取るので、false
b = (j, r どちらかの式と一緒); // b は、どちらの式の結果でも false
もうひとつ質問です。
「1+1=9ですかと聞かれたら、はいと答えますか?」
j = ((1 + 1 == 9) == true); // j はそのままの結果を受け取るのでfalse
r = !(!(1 + 1 == 9) == true); // r は逆の結果を受け取るので、false
b = (j, r どちらかの式と一緒); // b は、どちらの式の結果でも false
どうやら、そんなに悲観的になることは無いようです。
「×と聞かれたら、○と答えますか?」の回答が○になるのは、×が真となる質問の場合に限られているようです。
逆に、×が偽となる質問では「○と答えますか?」の回答は○ではありません。
ならば、○に入るのは「はい」でも「いいえ」でも「なっ!」でも「ぜ!」でも関係なくて、大切なのは○に対して○の回答が得られたかどうか言う結果だということがわかります。
もちろん、この場合「なっ!」と「ぜ!」どちらが「はい」か「いいえ」なのかはわかりません。でも、それを知ることが目的ではありません。
・・・以上で「あなたはQですかと聞かれたら、なっ!と答えますか?」
答えが「なっ!」ならQの質問は真、「ぜ!」なら偽になることがわかりました。
では、本番です。折角なのでコードで書きます。
言うまでもなく、1~3 は便宜上使っているだけで定数じゃありませんw
if (((3 == b) == na) == na) {
console.writeline("3 = b");
if (((2 == r) == na) == na) {
console.writeline("2 = r");
console.writeline("1 = j");
}
else {
console.writeline("2 = j");
console.writeline("1 = r");
}
}
else {
if (((3 == r) == na) == na) {
console.writeline("3 = r");
if (((2 == b) == na) == na) {
console.writeline("2 = b");
console.writeline("1 = j");
}
else {
console.writeline("2 = j");
console.writeline("1 = b");
}
}
else {
console.writeline("3 = j");
if (((2 == b) == na) == na) {
console.writeline("2 = b");
console.writeline("1 = r");
}
else {
console.writeline("2 = r");
console.writeline("1 = b");
}
}
}
突っ込み、待ってま~すw
#わちゃさんより、B氏の回答は完全にランダムなので、是か否かの回答も曖昧になる筈とのご指摘を受けました。
#確かにそうですね。近日中に修正版をアップします。・・・と言うかできればいいなぁ。(解ける保障はどこにもないw)