小町算をJavaScriptで解いてみた(2)

 前回作ったプログラムで、多重ループが気に入らなかったので、ちょっと書き直してみました。(^_^;
ちょっと遅くなりましたが、見た目はすっきりしました。

<!--
/*
 * Komachizan02.html
 *
 * □1□2□3□4□5□6□7□8□9=100
 * 
 * (1)□={"","-","+"}
 * (2)□={"","-","+","*","/"}
 *
 */
//-->

<html>
<head>
<title>Komachizan.html</title>
<script type="text/javascript">
// 重複順列生成
function next_rep_perm(p,n,r)
{
  var t=0;
  //if(n<=0 || r <= 0) return 0;
  for(var i=0; i< r; t*=n,t+=p[i++]);
  for(t++,r--; r>=0; p[r]=t%n,t-=p[r--],t/=n);
  return(!t);
}
</script>
</head>
<body>
<script type="text/javascript">
  var M=100;
  var N=3;
  var R=8;
  if(N==3)      // (1)空白と'+','-'だけ使用する場合
    var o=["","-","+"];
  else if(N==5) // (2)空白と'+','-','*','/'を使用する場合
    var o=["","-","+","*","/"];

  var s=["","-"];
  var i=new Array(R);
  for(var j=0; j< R; i[j++]=0);

  var tm=(new Date()).getTime();  // Timer start

  for(var j in s){  // 先頭は空白か'-'とする
    do{
      var f=  s[j] +"1"+o[i[0]]+"2"+o[i[1]]+"3"
           +o[i[2]]+"4"+o[i[3]]+"5"+o[i[4]]+"6"
           +o[i[5]]+"7"+o[i[6]]+"8"+o[i[7]]+"9";
      if(eval(f)==M) document.write(f,"=",M,"<br>");
    } while(next_rep_perm(i,N,R));
  }
  tm=(new Date()).getTime()-tm;  // Timer stop
  document.write("Runtime : ",tm/1000.0, "[sec]<br>");
</script>
</body>
</html>

●実行結果

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 : 0.175[sec]