R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

3人を特定するという問題(その2)

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)

投稿日時 : 2006年9月20日 19:33

Feedback

# re: 3人を特定するという問題(その2) 2006/09/21 9:17 わちゃ

解答はいつかなぁと思っていたら、いつの間にか、こちらにあったんですね。

で、原題をみるかぎり、B 氏は、J 氏や、R 氏のどちらかのまねをするのではなくて、
完全にランダムに解答をするような印象です。

これを関数表記風にすると、、、、

boolean function J( boolean X ) {
  return X;
}

boolean function R( boolean X ) {
  return !X;
}

boolean function B( boolean X ) {
  return Random.Next(2) == 0;
}

という感じでしょうか。

そのため、

 J( J( X ) == true ) => true
 R( R( X ) == true ) => true
 B( B( X ) == true ) => RANDOM!!

だと思うんですが、いかがでしょうか?

# re: 3人を特定するという問題(その2) 2006/09/21 9:25 R・田中一郎

「1+1=9ですかと聞かれたら、はいと答えますか?」
以下の部分の式、間違っていたので訂正しておきました。



と書きに来たら、わちゃさんからコメントをいただいていますね。
わちゃさん、ありがとうございます。

>解答はいつかなぁと思っていたら、いつの間にか、こちらにあったんですね。

昨日アップしたばかりで、時間がなくて @IT の方にはまだ投稿していませんでした。

>で、原題をみるかぎり、B 氏は、J 氏や、R 氏のどちらかのまねをするのではなくて、
>完全にランダムに解答をするような印象です。

なるほど、B氏に関する考察がちょっと甘かったかな?、と思っていたのですが、確かにそうですね。
早速、B氏の部分をもうすこし考えて見ます。
ありがとうございました!


#というか、わちゃさんは既に解けているのですよね^^;
#凄いです!

# 3人を特定するという問題(その3) 2006/09/21 18:28 R.Tanaka.Ichiro's BLOG

3人を特定するという問題(その3)

# 3人を特定するという問題(その3) 2006/09/22 1:16 R.Tanaka.Ichiro's BLOG

3人を特定するという問題(その3)

タイトル
名前
Url
コメント