2012-01-01 2 views
2

게임을 만들고 있는데 일부 게임 조각을 생성해야합니다. 각 조각은 0부터 2까지의 범위에 해당하는 4 개의 숫자로 구성된 배열입니다 (각각 조각의 속성을 나타냄). 모든 게임을 얻으려면 모든 조합을 생성해야합니다.자바 스크립트에서 모든 조합 찾기

그래서 [1, 0, 2, 0], [2, 0, 0, 1], [0, 0, 0, 0], [1, 0, 1, 0]

각 변수는 숫자 0-2 인 [a, b, c, d]의 총 81 개 조합이 있어야합니다.

자바 스크립트를 사용하고 있지만 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; 
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, yes, thanks. 감사합니다. '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. 
} 

: 여기

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); 
} 

은 더 까다 솔루션 그러나 희망, 더 나은 뒤에 수학을 보여주는 것입니다 @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' 트릭이 필요하지 않습니다. –