Поиск всех комбинаций в JavaScript - PullRequest
2 голосов
/ 01 января 2012

Я создаю игру, и мне нужно создать несколько игровых фигур.Каждый фрагмент представляет собой массив, состоящий из 4 чисел (каждое представляет свойство элемента) в диапазоне от 0 до 2Мне нужно сгенерировать все комбинации, чтобы получить все игровые фигуры.

Так что мне нужно было бы [1, 0, 2, 0], [2, 0, 0, 1], [0, 0, 0,0], [1, 0, 1, 0] и т. Д.

Всего должно быть 81 комбинация [a, b, c, d], где каждая переменная представляет собой число 0-2.

Я использую javascript, но любой псевдокод будет полезен.

Любая помощь приветствуется.Спасибо!

Ответы [ 3 ]

3 голосов
/ 01 января 2012

Mine

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));
}
3 голосов
/ 01 января 2012

Если это домашнее задание, пометьте его так.

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;
  }));
}
1 голос
/ 01 января 2012
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)
    )
}
...