3人を特定するという問題(その3)
3人を特定するという問題:http://blogs.wankuma.com/rti/archive/2006/09/15/38848.aspx
3人を特定するという問題(その2):http://blogs.wankuma.com/rti/archive/2006/09/20/39201.aspx
前回の内容ですが、コメントにて、わちゃさんからご指摘をいただきました。
これによって、次のことがわかりました。
「あなたはQですかと聞かれたら、なっ!と答えますか?」の質問に対して、答えが「なっ!」ならQの質問は真、「ぜ!」なら偽になる。(これが通用するのは、J氏R氏の2名のみ)
理由は、「なっ!」か「ぜ!」をランダムに回答するB氏の回答からは、規則性を見出せないから。
しかし、J氏とR氏の回答からは常に正しい結果を得られることがわかります。
じゃあB氏からは、正しい結果は得られないのでしょうか?・・・
答えは、正しい場合もあれば、違っている場合もある。
・・・と言うことは、「間違った回答をした人はB氏である。」と言えます!
ここまで判断材料が揃えば、何とかなりそうです。
但し、3名が常に同じ回答をするという定理が崩れたため、今回は誰に聞くのかが大変重要になります。
そこで、Q() と言う便利なメソッドを用意します。
このメソッドを使って「1番の人に質問します。3番はB氏ですね?と聞いたら、なっ!と答えますか?」の質問は、以下の記述にします。
if Q(1, 3 = B) {}
その結果、なっ!と答えたら true 、ぜ!と答えたら false が返る訳です。
但し、質問した人がB氏だった場合は、true, false の結果は信用できません。
つまり、Qメソッドは、基本的に、(((3 == b) == na) == na) の判定がなされているのですが、運悪く HearNumber(以下参照) が B氏だった場合は、ランダムで結果を返るのだと考えて下さい。
boolean Q(int HearNumber, int Number, int Who) {
・・・ここで何をしているのかは秘密w
}
void main() {
if (Q(1, 3, b)) {
if (Q(2, 3, b)) {
console.writeline("3 = b"); // 二人が同じ結果を返したので確定
if (Q(1, 2, R)) { // 他の二人は b でないから、この結果は信用できる
console.writeline("2 = R");
console.writeline("1 = J");
}
else {
console.writeline("2 = J");
console.writeline("1 = R");
}
}
else {
// 1 と 2 は異なる回答なので、どちらかが b である
// よって 3 は b ではありません。
// つまり最初に 3 は b でないと言った 1 は嘘をついたので b に確定
console.writeline("1 = b");
if (Q(3, 3, R)) { // 他の二人は b でないので、この結果は信用できる
console.writeline("2 = J");
console.writeline("3 = R");
}
else {
console.writeline("2 = R");
console.writeline("3 = J");
}
}
}
else {
// 1 が b なら、他の人は全員が本当のことを言う。
// 1 が b でないなら、本当のことを言う。つまり 3 は b では無い。
// つまり、1が b でも、b じゃなくても 3 は本当のことを言う。
// ってことは、3 は b じゃない。
if (Q(3, 2, B)) {
console.writeline("2 = B");
if (Q(3, 1, R)) {
console.writeline("1 = R");
console.writeline("3 = J");
}
else {
console.writeline("1 = R");
console.writeline("3 = J");
}
}
else {
// 上にあるように 3 は本当のことを言う。つまり 2 は b ではない。
// 上にあるように 3 は本当のことを言う。つまり 3 も b ではない。
// ってことは残りが・・・
console.writeline("1 = B");
if (Q(3, 2, R)) {
console.writeline("2 = R");
console.writeline("3 = J");
}
else {
console.writeline("2 = J");
console.writeline("3 = R");
}
}
}
}
これでどうだろうか?
ツッコミ更にまってま~すっw