JavaScriptで作った小町算のプログラムをJavaに翻訳してみた。

 JavaScriptで作った小町算のプログラムJavaに翻訳してみました。(^_^;
 実行結果は、JavaScriptの約10倍ぐらい遅いようです。お粗末な結果となってしまいました。(^_^;
 面倒だけど、アルゴリズム辞典などから自作のeval()を作った方がいいのかな。(^_^;

●Komachizan01.java

/* 
 * Komachizan01.java
 * 
 * □1□2□3□4□5□6□7□8□9=100
 * 
 * (1)□={"","-","+"}
 * (2)□={"","-","+","*","/"}
 * 
 */

import javax.script.*;

public class Komachizan01 {
    static ScriptEngineManager factory = new ScriptEngineManager();
    static ScriptEngine engine = factory.getEngineByName("JavaScript");
    
    static String sEval(String sExpr) {
        try{
            return( engine.eval(sExpr).toString() );
        }
        catch(Exception e){ // System.out.println(e);
            return("error: "+e);
        }
    }
    
    static double dEval(String sExpr) {
        try{
            return( Double.parseDouble(engine.eval(sExpr).toString()) );
        }
        catch(Exception e){ // System.out.println(e);
            return( Double.NaN );
        }
    }
    
    static boolean next_rep_perm(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);
    }
    
    public static void main(String[] args) {
        final int M=100;
        final int N=3;              // (1)空白と'+','-'だけ使用する場合
        //final int N=5;            // (2)空白と'+','-','*','/'を使用する場合
        final int R=8;
        final String OPR=" -+*/";
        
        char[] o=OPR.toCharArray();
        int[]  p=new int[R];
        String f="";
        long tm=System.nanoTime();      // Timer Start
        
        for(int i=0; i< 2; i++){        // 先頭は空白か'-'とする
            for(int j=0; j< R; j++) p[j]=0;
            do{
                f=String.format("%c1%c2%c3%c4%c5%c6%c7%c8%c9",o[i],
                    o[p[0]],o[p[1]],o[p[2]],o[p[3]],o[p[4]],o[p[5]],o[p[6]],o[p[7]]);
                f=f.replace(" ","");
                //System.out.println(f+"="+sEval(f));
                if(dEval(f)==M) System.out.println(f+"="+M);
            } while(next_rep_perm(p,N,R));
        }       
        tm=System.nanoTime()-tm;        // Timer Stop
        System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9);
    }
}

●実行結果

123-45-67+89=100
123-4-5-6-7+8-9=100
123+45-67+8-9=100
123+4-5+67-89=100
12-3-4+5-6+7+89=100
12+3-4+5+67+8+9=100
12+3+4+5-6-7+89=100
1+23-4+56+7+8+9=100
1+23-4+5+6+78-9=100
1+2+34-5+67-8+9=100
1+2+3-4+5+6+78+9=100
-1+2-3+4+5+6+78+9=100
Runtime : 1.747 [sec]

※参考URL
以前、出題したプログラムクイズをJavaに翻訳してみた。
小町算をJavaScriptで解いてみた(2)
JavaScriptで作った小町算のプログラムをJavaに翻訳してみた。(2)

evalMyJava(Javaでの自作のeval関数)
Java文字列内の式の解釈/演算クラス(Hishidama's Java-Eval class)
JavaからJavaScriptを呼び出すサンプル - 昼間のメモ
using eval in Java - Stack Overflow
『Javaによるアルゴリズム事典』サポートページ

C言語による最新アルゴリズム事典 (ソフトウェアテクノロジー)

C言語による最新アルゴリズム事典 (ソフトウェアテクノロジー)

Javaによるアルゴリズム事典

Javaによるアルゴリズム事典