知恵袋の判断推理の論理問題を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)
- 作者: 柴田望洋
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2007/08/08
- メディア: 単行本
- 購入: 16人 クリック: 271回
- この商品を含むブログ (55件) を見る