2016-04-05 5 views
1

各桁が0,1,2,3または4の4桁のロックが指定されている場合、合計4個までのすべての組み合わせの配列を作成するにはどうすればよいですか? 例えば:各桁が0,1,2,3または4の4桁のロックが与えられている場合、どのように合計して合計4を計算することができますか?

[1, 1, 1, 1] is good, 1 + 1 + 1 + 1 == 4 
[4, 0, 0, 0] is good, 4 + 0 + 0 + 0 == 4 
[0, 4, 0, 0] is good, 0 + 4 + 0 + 0 == 4 
[0, 3, 1, 0] is good, 0 + 3 + 1 + 0 == 4 
[0, 0, 2, 2] is good, 0 + 0 + 2 + 2 == 4 
[1, 2, 3, 4] is not, because 1 + 2 + 3 + 4 != 4 

ひとつのアイデアは、数字を追加し、彼らは4 ==かどうかを確認し、すべての4桁の数字(0000、1000年、0100、0010、...)を介して、ちょうどブルートフォースループでしたもしそうなら、それを私のリストに追加してください。ここで問題となるのは、無駄な繰り返しがたくさんあるということです。なぜならこれらの数字は決して== 4なので、5桁以上は気にしないからです。

私はこれを何時間も考えていましたが、新鮮な視点、ありがとう!

+2

、あなたはそれぞれの桁が1、2、3、または4することができ言っているしかし、あなたの例では、あなたは同様に0を使用しています。それは間違いですか? – niyasc

+0

あなたが正しいです、更新させてください。数字は0,1,2,3、または4になります。 – prgrmnerd

+1

これは、[配列のすべての組み合わせを生成する](http://codereview.stackexchange.com/questions/7001/generating-all-combinations-of-an-array) – ozil

答えて

0

は、私はあなたのために仕事をするべきではなく、単純な最適化は、組み合わせがあるとすぐに現在の反復を停止するだろう>これは権利を取得するための反復再帰的なスタイルを使用する提案である4.

+0

それは助けになるかもしれませんが、4よりも小さい反復も数えることになります。これは無駄なサイクルになるでしょう。 – prgrmnerd

+0

コメントに記載する必要があります –

1

長さと必要な合計。

これは、必要な場合は7など、任意の長さで、到達可能な場合はすべての合計に対して機能します。あなたの仕様で

function combine(array, length, sum) { 
 
    function add(a, b) { return a + b; } 
 

 
    function iter(a) { 
 
     var r = this.concat(a); 
 
     if (r.length === length) { 
 
      r.reduce(add) === sum && result.push(r); 
 
      return; 
 
     } 
 
     array.forEach(iter, r); 
 
    } 
 

 
    var result = []; 
 
    array.forEach(iter, []); 
 
    return result; 
 
} 
 

 
document.write('<pre>' + JSON.stringify(combine([0, 1, 2, 3, 4], 4, 4), 0, 4) + '</pre>'); 
 
document.write('<pre>' + JSON.stringify(combine([0, 1, 2, 3], 3, 5), 0, 4) + '</pre>');

関連する問題