【问题标题】:Finding all combinations in javascript在javascript中查找所有组合
【发布时间】:2012-01-01 17:14:51
【问题描述】:

我正在创建一个游戏,我需要生成一些游戏片段。每一块是一个由 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,但任何伪代码都会有所帮助。

感谢任何帮助。谢谢!

【问题讨论】:

  • 那些不是排列。排列是 [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]。
  • AFAIK,你想要的是组合,而不是排列。
  • 对,不是组合。这就是我在我的例子中正确的吗?
  • 听起来像家庭作业...提示:您可以制作 4 个嵌套循环。
  • 如果是家庭作业,他们就不会调用组合排列。

标签: javascript combinations


【解决方案1】:

我的

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 的 cmets 的更新

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

【讨论】:

  • toString(3)!我完全忘记了!
  • @herby,很幸运,因为这个toString/slice 方法是42% slower
  • 对于切片,您可以明确地使用 Array 的切片:[].slice.call("000"+str, 4)。此外,如果 i 以 81 开头并以 &lt; 162 /* 2*81 */ 结尾,则不需要 "000"+str 技巧。
  • @katspaugh:更不用说它不能正确解决问题,因为它存储的是一个字符的字符串,而不是数字(map(Number) 可以解决问题,但会更慢)。跨度>
  • 你测量过它制作 81 个数组的速度有多慢吗?另外我认为我的比你的通用的更容易阅读
【解决方案2】:

如果是作业,请标记它。

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

【讨论】:

  • 在看到@katspaugh 提出了通用解决方案后,我也要让我的通用解决方案......
【解决方案3】:
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)
    )
}

【讨论】:

  • 这也产生字符串,而不是数字,不是吗?
猜你喜欢
  • 2018-08-18
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 2018-07-31
  • 2020-07-26
  • 1970-01-01
相关资源
最近更新 更多