在javascript中查找所有组合

在javascript中查找所有组合,javascript,combinations,Javascript,Combinations,我正在创建一个游戏,我需要生成一些游戏片段。每个片段是由4个数字组成的数组(每个数字代表片段的一个属性),范围从0到2。我需要生成所有的组合来获得所有的游戏碎片 所以我需要[1,0,2,0],[2,0,0,1],[0,0,0],[1,0,1,0]等等 [a、b、c、d]的组合总共应该有81个,其中每个变量都是数字0-2 我正在使用javascript,但任何psudocode都会有所帮助 感谢您的帮助。谢谢 如果是家庭作业,请将其标记为家庭作业 var BASE = 3, LEN = 4, LI

我正在创建一个游戏,我需要生成一些游戏片段。每个片段是由4个数字组成的数组(每个数字代表片段的一个属性),范围从0到2。我需要生成所有的组合来获得所有的游戏碎片

所以我需要[1,0,2,0],[2,0,0,1],[0,0,0],[1,0,1,0]等等

[a、b、c、d]的组合总共应该有81个,其中每个变量都是数字0-2

我正在使用javascript,但任何psudocode都会有所帮助


感谢您的帮助。谢谢

如果是家庭作业,请将其标记为家庭作业

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,LIMIT=Math.round(Math.pow(BASE,LEN));
var c=[];
对于(变量i=0;i
下面是一个更棘手的解决方案,但希望能更好地展示其背后的数学原理:

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;
  }));
}
var基=3,LEN=4;
var幂=[];
对于(变量i=0,极限=1;i
var BASE=3,COMB\u LEN=4
var max=parseInt(新数组(COMB_LEN+1).join(BASE-1),BASE),
comb=新数组(comb_LEN+1)。联接(0)。拆分(“”)。映射(编号)
变量组合=[],i,n
对于(i=0;iMine

var arr=[];

对于(var-str,i=0;它们不是置换。置换是[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1].AFAIK,你想要的是组合,而不是置换。对,不是组合。这就是我在示例中所做的,对吗?听起来像是家庭作业…提示:你可以创建4个嵌套循环。如果是家庭作业,他们就不会调用组合置换。
toString(3)
!我完全忘记了!@herby,这是幸运的,因为这种
toString
/
slice
方法是。至于slice,你可以直接使用数组的slice:
[].slice.call(“000”+str,4)
。另外,如果
I
以81开头,以
<162/*2*81*//code>结尾,那么
“000”+str
技巧是不需要的。@katspaugh:更不用说它不能正确地解决问题,因为它只存储一个字符串,而不是数字(
map(Number)
可以实现技巧,但会使它更慢).你测量过它生成81个数组的速度吗?而且我认为我的比你的通用数组更容易阅读。这也会生成字符串,而不是数字,不是吗?在看到@katspaugh生成的通用解决方案后,我也会将我的数组生成为通用的。。。
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)
    )
}
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 arr=[];
for (var str,i=81;i<162;i++) {
  str = i.toString(3);
  arr.push((str).slice(-4).split('').map(Number));
}