以前、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入門 (今すぐ使えるかんたんプラス)
- 作者: 大津真
- 出版社/メーカー: 技術評論社
- 発売日: 2010/06/04
- メディア: 大型本
- クリック: 3回
- この商品を含むブログ (2件) を見る
JavaScript & jQueryレッスンブック―最新jQuery対応
- 作者: 大津真
- 出版社/メーカー: ソシム
- 発売日: 2011/12/01
- メディア: 単行本
- 購入: 2人 クリック: 21回
- この商品を含むブログを見る
- 作者: 大津真
- 出版社/メーカー: オーム社
- 発売日: 2006/09/23
- メディア: 大型本
- 購入: 1人 クリック: 75回
- この商品を含むブログ (20件) を見る