2つの発言の「うそつき問題」をJavaで解いてみました。(^_^;
ある事件の容疑者A〜Eの5人が、次のような2つの発言をした。5人の発言は1つが真実で、もう一つがうそであるとき、犯人はだれか。
A「私は犯人ではない。」「誰が犯人かは知らない」
B「私は犯人ではない。」「Aが犯人である」
C「私は犯人ではない。」「Bは犯人ではない」
D「私は犯人ではない。」「Cは犯人ではない」
E「私は犯人ではない。」「Dが犯人である」
ちなみに、Aの証言「誰が犯人かは知らない」は、本当ならば、「Aは犯人ではない」ということになりますが、嘘ならば、「誰が犯人か知ってる」というだけで、「犯人はAまたはBまたはCまたはDまたはEである」ということになります。これは、当り前の大前提だから、省略することが出来ます。(^_^;
よって、犯人をxとすると、Aの証言は、
( x!='A' ) || ( !(x!='A') && (x!='A') )
となり、ORの後半は矛盾しているので、結局、Aの証言からは、「Aは犯人ではない。」ということが分かります。
それから、「^」は排他的論理和(XOR)です。
P^Q ≡ ( P && !Q ) || ( !P && Q )
●Lair03.java
/* * Lair03.java * */ class Lair03 { public static void main(String[] args) { char[] p ="ABCDE".toCharArray(); long tm; tm=System.nanoTime(); // Timer Start for(char x : p) { if(x=='A') continue; if(!( (x!='B')^(x=='A') )) continue; if(!( (x!='C')^(x!='B') )) continue; if(!( (x!='D')^(x!='C') )) continue; if(!( (x!='E')^(x=='D') )) continue; // チェックを潜り抜けたものだけを表示 System.out.printf("%c\n", x); } tm=System.nanoTime()-tm; // Timer Stop System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9); } }
●実行結果
C Runtime : 0.021 [sec]
※参考URL
●知恵袋の「うそつき問題」をJavaで解いてみた。
●ネットで見つけた「うそつき問題」をJavaで解いてみた。
●2つの発言の「うそつき問題」をJavaで解いてみた。
- 作者: 川場隆
- 出版社/メーカー: 秀和システム
- 発売日: 2009/10/23
- メディア: 単行本
- 購入: 14人 クリック: 162回
- この商品を含むブログ (33件) を見る
パーフェクトJava (PERFECT SERIES) (PERFECT SERIES 2)
- 作者: アリエル・ネットワーク株式会社,井上誠一郎,永井雅人,松山智大
- 出版社/メーカー: 技術評論社
- 発売日: 2009/09/24
- メディア: 大型本
- 購入: 26人 クリック: 360回
- この商品を含むブログ (35件) を見る
- 作者: 林晴比古
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2012/11/29
- メディア: 単行本
- クリック: 2回
- この商品を含むブログ (1件) を見る