知恵袋の判断推理の論理問題をJavaで解いてみた。

 知恵袋の判断推理の論理問題Javaで解いてみました。と、いうより、この前、Pythonで作ったプログラムJavaに翻訳してみました。(^_^;
 今回は、条件を満たす場合の真理値表の横に選択肢の真理値表も付けてみました。
 ちなみに、次のように、for-each文を使ってもよかったのですが、ネストを深くしたくなかったので、do{〜} while(nextRepPerm(…));構文を使いました。(^_^;

        for(boolean m : new boolean[] {true, false}) {
            for(boolean e : new boolean[] {true, false}) {
                for(boolean o : new boolean[] {true, false}) {
                    for(boolean s : new boolean[] {true, false}) {
                        for(boolean a : new boolean[] {true, false}) {
                            for(boolean j : new boolean[] {true, false}) {
                                …
                            }
                        }
                    }
                }
            }
        }

● Logic1.java

/*
 * Logic1.java
 */

class Logic1 {
    // 重複順列生成
    static boolean nextRepPerm(int[] p, int n, int r) {
        int cy=1;
        
        for(int i=r-1; i>=0; i--) {
            p[i]+=cy;
            if(p[i]>=n){ p[i]=0; cy=1; } else cy=0;
        }
        if(cy==0) return(true);
        return(false);
    }
    // 論理包含「A⇒B」の真理値を得る
    static boolean Imp(boolean a, boolean b) {
        return !a | b;
    }
    // 真理値表の1行を文字列で得る
    static String getRowOfTruthTable(boolean[] lst) {
        String result = "";
        for(boolean b : lst)
            result += b ? " T" : " F";
        return result;
    }
    
    public static void main(String[] args) {
        boolean[] t = {true,false};     // nextRepPermで使用
        int[]     p = {0,0,0,0,0,0};    // 〃
        boolean[] choices = {true,true,true,true,true};     // 選択肢
        
        // m:数学; e:英語; o:音楽; s:社会; a:美術; j:国語; 1〜5:選択肢
        System.out.println("[m,e,o,s,a,j] 1 2 3 4 5");
        long tm = System.nanoTime();    // Timer Start
        do{     //--- p loop ---//
            boolean m = t[p[0]], e = t[p[1]], o = t[p[2]];
            boolean s = t[p[3]], a = t[p[4]], j = t[p[5]];
            if (!Imp(   m,  e)) continue;   // 条件A
            if (!Imp(   o,s&m)) continue;   // 条件B
            if (!Imp(  !s,  a)) continue;   // 条件C
            if (!Imp(e|!a,  j)) continue;   // 条件D
            // チェックを潜り抜けたものだけを表示
            System.out.print(getRowOfTruthTable(new boolean[] {m,e,o,s,a,j})+" ");
            // 選択肢のチェック
            boolean c1,c2,c3,c4,c5;
            choices[0] &= (c1 = Imp( m, s));
            choices[1] &= (c2 = Imp(!j,!s));
            choices[2] &= (c3 = Imp(!a, e));
            choices[3] &= (c4 = Imp( o, j));
            choices[4] &= (c5 = Imp(!e, a));
            System.out.println(getRowOfTruthTable(new boolean[] {c1,c2,c3,c4,c5}));
        } while(nextRepPerm(p,2,6));
        
        System.out.print("∴");
        for(int i=0; i< 5; i++)
            if(choices[i]) System.out.print(" "+(i+1));
        System.out.println();
        tm = System.nanoTime()-tm;      // Timer Stop
        System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9);
    }
}

●実行結果

[m,e,o,s,a,j] 1 2 3 4 5
 T T T T T T  T T T T T
 T T T T F T  T T T T T
 T T F T T T  T T T T T
 T T F T F T  T T T T T
 T T F F T T  F T T T T
 F T F T T T  T T T T T
 F T F T F T  T T T T T
 F T F F T T  T T T T T
 F F F T T T  T T T T T
 F F F T T F  T F T T T
 F F F T F T  T T F T F
 F F F F T T  T T T T T
 F F F F T F  T T T T T
∴ 4
Runtime : 0.003 [sec]

※参考URL
知恵袋の判断推理の論理問題をPythonで解いてみた。
知恵袋の判断推理の論理問題をPythonで解いてみた。(2)

明解Java 入門編

明解Java 入門編