2つの発言の「うそつき問題」をJavaで解いてみた。

 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で解いてみた。

わかりやすいJava入門編

わかりやすいJava入門編

パーフェクトJava (PERFECT SERIES) (PERFECT SERIES 2)

パーフェクトJava (PERFECT SERIES) (PERFECT SERIES 2)

明快入門 Java (林晴比古実用マスターシリーズ)

明快入門 Java (林晴比古実用マスターシリーズ)