組合せ生成プログラム JavaScript (3)

 以前、JavaScriptで作った組合せ生成プログラムをちょっと書き直してみました。3つの関数を2つにまとめてみました。(^_^;
 これを使って、以前、Javaで作った同じものを含む組合せの質問を解くプログラムJavaScriptに翻訳してみました。

●GenComb03.html

<html>
<head>
<title>GenComb03.html</title>
<script type="text/javascript">
// 順列生成
function next_perm(p, n, r) {
  var i, j, k, tmp;
  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--)
      tmp = p[j], p[j] = p[j-1], p[j-1] = tmp;
  for(i = n - 1; i > 0 && p[i-1] >= p[i]; i--);
  if(!i) return(false);
  for(j = n - 1; j > i && p[i-1] >= p[j]; j--);
  tmp = p[i-1], p[i-1] = p[j], p[j] = tmp;
  for(j = n - 1; i < j; i++, j--)
    tmp = p[i], p[i] = p[j], p[j] = tmp;
  return(true);
}
// 組合せ生成
function next_comb(p, n, r) {
  var i;
  do {
    if(!next_perm(p,n,r)) return(false);
    for(i = 0; i< r-1; i++)
      if(p[i]> p[i+1]) break; 
  } while(i< r-1);
  return(true);
}
</script>
</head>
<body>
<script type="text/javascript">
var count=0
var P="白白赤赤赤青青青青";
var N=P.length;
var R=5;
var p = P.split('').sort();

var tm=(new Date()).getTime();  // Timer start
do{
  count++;
  document.write(p.slice(0,R).join(''),"<br>");
}while(next_comb(p,N,R));
document.write("計: ",count,"<br>");
tm=(new Date()).getTime()-tm;  // Timer stop
document.write("Runtime : ",tm/1000.0, "[sec]<br>");
</script>
</body>
</html>

●実行結果

白白赤赤赤
白白赤赤青
白白赤青青
白白青青青
白赤赤赤青
白赤赤青青
白赤青青青
白青青青青
赤赤赤青青
赤赤青青青
赤青青青青
計: 11
Runtime : 0[sec]

※参考URL
http://stackoverflow.com/questions/8761627/string-tochararray-equivalent-on-javascript
http://merit314.web.fc2.com/js/genperm.js

組合せ生成プログラム JavaScript - rscの日記
組合せ生成プログラム JavaScript (2) - rscの日記

3ステップでしっかり学ぶ JavaScript入門 (今すぐ使えるかんたんプラス)

3ステップでしっかり学ぶ JavaScript入門 (今すぐ使えるかんたんプラス)

JavaScript & jQueryレッスンブック―最新jQuery対応

JavaScript & jQueryレッスンブック―最新jQuery対応

JavaScriptプログラミング入門 第2版

JavaScriptプログラミング入門 第2版