SEND MORE MONEY in Java

 以前、JavaScriptで作ったSEND MORE MONEY のプログラムJavaに翻訳してみました。
 Javaのプログラムは、ふつうCより遅いんですが、このプログラムの場合は、Cより少し速いようです。意外な結果が出てしまいました。(^_^;

●SendMoreMoney01.java

/*
 * SendMoreMoney01.java
 */

class SendMoreMoney01 {
    // 順列生成
    static boolean next_perm(int[] p, int n, int r) {
        int i, j;
        int t;
        
        if(r <= 0 || n < r) return(false);
        for(i = r + 1; i <= n-1; i++)
            for(j = i; j >= r + 1 && p[j-1] < p[j]; j--){
                t = p[j]; p[j] = p[j-1]; p[j-1] = t;    // swap(p,j,j-1);
            }
        for(i = n - 1; i > 0 && p[i-1] >= p[i]; i--);
        if(i==0) return(false);
        for(j = n - 1; j > i && p[i-1] >= p[j]; j--);
        t = p[j]; p[j] = p[i-1]; p[i-1] = t;            // swap(p,j,i-1);
        for(j = n - 1; i < j; i++, j--){
            t = p[i]; p[i] = p[j]; p[j] = t;            // swap(p,i,j);
        }
        return(true);
    }
    
    static int Hn(int p, int q, int r,int s, int t) {
        return(10*(10*(10*(10*p+q)+r)+s)+t);    // 10000*p+1000*q+100*r+10*s+t
    }
    
    public static void main(String[] args) {
        int[] p = {0,1,2,3,4,5,6,7,8,9};
        int s,e,n,d,m,o,r,y;
        int send, more, money;
        long tm=System.nanoTime();      // Timer Start
        
        do{
            s=p[0]; e=p[1]; n=p[2]; d=p[3]; m=p[4]; o=p[5]; r=p[6]; y=p[7];
            if(s*m==0) continue;        // (s==0||m==0)ならスキップ
            send  = Hn(0,s,e,n,d);
            more  = Hn(0,m,o,r,e);
            money = Hn(m,o,n,e,y);
            if(send+more!=money) continue;
            // チェックを潜り抜けたものだけを出力
            System.out.println("  "+send);
            System.out.println(" +"+more);
            System.out.println("-------");
            System.out.println(" "+money);
            System.out.println();     
        }while(next_perm(p,10,8));
        tm=System.nanoTime()-tm;        // Timer Stop
        System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9);
    }
}

●実行結果

  9567
 +1085
-------
 10652

Runtime : 0.091 [sec]

※参考URL
http://www.coderanch.com/t/595306/java/java/Optimizing-send-money-code
SEND MORE MONEY C言語プログラム - rscの日記
SEND MORE MONEY(2) C++ - rscの日記
SEND MORE MONEY(3) C言語プログラム - rscの日記
SEND MORE MONEY JavaScriptプログラム - rscの日記
SEND MORE MONEY in Python - rscの日記
SEND MORE MONEY in Ruby - rscの日記
SEND MORE MONEY in Python(2) - rscの日記
SEND MORE MONEY in Ruby(2) - rscの日記
SEND MORE MONEY in Python(3) - rscの日記

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

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

明解Java 入門編

明解Java 入門編