2012-01-01 26 views
2

私はゲームを作成しており、ゲームの一部を生成する必要があります。各ピースは、0〜2の4つの数字(各ピースのプロパティを表します)からなる配列です。私はすべてのゲームを得るためにすべての組み合わせを生成する必要があります。javascriptですべての組み合わせを見つける

私は[1,0,0、0]、[2、0、0、1]、[0、0、0、0]、[1,0,1,0]などが必要です。

[a、b、c、d]の合計81個の組み合わせがあり、各変数は0〜2の数字です。

私はjavascriptを使用していますが、psudocodeは役に立ちます。

何か助けていただければ幸いです。ありがとう!

+0

これらは順列ではありません。順列は[1,2,3]、[1,3,2]、[2,1,3]、[2,3,1]、[3,1,2]、[3,2,1]です。 –

+1

AFAIK、あなたが望むのは、*組合せ*であり、順列ではありません。 –

+0

また、何を試しましたか? –

答えて

3

宿題の場合は、そのまま宿題にします。ここで

var BASE = 3, LEN = 4, LIMIT = Math.round(Math.pow(BASE, LEN)); 
var c = []; 
for (var i = 0; i < LIMIT; ++i) { 
    var item = []; 
    for (var j = 0, k = i; j < LEN; ++j, k = Math.floor(k/BASE)) { 
    item.push(k % BASE); 
    } 
    c.push(item); 
} 

がうまくいけば、よりトリッキーな解決策であるが、より良い、その背後に数学を示す:

var BASE = 3, LEN = 4; 
var powers = []; 
for (var i = 0, LIMIT = 1; i < LEN; ++i, LIMIT *= BASE) { 
    powers.push(LIMIT); 
} 
var c = []; 
for (i = 0; i < LIMIT; ++i) { 
    c.push(powers.map(function(basePower) { 
    return Math.floor(i/basePower) % BASE; 
    })); 
} 
+0

@katspaughがジェネリックソリューションを作ったのを見て、私も一般的なものを作ります... –

+0

これはまだ受け入れられた答えではないのですか? –

1
var BASE = 3, COMB_LEN = 4 

var max = parseInt(new Array(COMB_LEN + 1).join(BASE - 1), BASE), 
    comb = new Array(COMB_LEN + 1).join(0).split('').map(Number) 

var combinations = [], i, n 
for (i = 0; i <= max; i++) { 
    n = i.toString(BASE).split('').map(Number) 
    combinations.push(
     comb.slice(0, COMB_LEN - n.length).concat(n) 
    ) 
} 
+0

これも数値ではなく文字列を生成しますか? –

+0

@herby、はい、ありがとう。 'map(Number)'を追加しました。 – katspaugh

3

鉱山

var arr=[]; 
for (var str,i=0;i<81;i++) { 
    str = i.toString(3); 
    arr.push(("000"+str).slice(-4)); // Hmm, I thought slice returned an array. 
} 

ここで考慮にコメントを取ってアップデートです@katspaughと@herbyから

var arr=[]; 
for (var str,i=81;i<162;i++) { 
    str = i.toString(3); 
    arr.push((str).slice(-4).split('').map(Number)); 
} 
+0

'toString(3)'!完全に忘れた! –

+0

@herby、この 'toString' /' slice'アプローチは[42%遅い](http://jsperf.com/maths-vs-naivitet)なので幸いです。 – katspaugh

+1

スライスに関しては、Arrayのスライスを明示的に使用することができます: '[] .slice.call(" 000 "+ str、4)'。また、 'i'が81で始まり、' <162/* 2 * 81 */'で終わると、' '000 '+ str'トリックは必要ありません。 –

関連する問題