Google 电子表格:生成 4 列的所有组合,每列 8 行

问题描述 投票:0回答:3

我想为 Google 表格创建一个函数,允许我列出数字 1 到 8 的所有可能组合,连接 4 次(从 1111 到 8888,我认为是 8^4 = 4096)。

(为清楚起见,我添加了屏幕截图)。

到目前为止我试过:

=ArrayFormula(transpose(split(concatenate(A2:A9&B2:B9&C2:C9&D2:D9& char(9)),char(9))))

...但这只给了我 8 种组合:1111、2222、3333、4444、5555、6666、7777、8888。

我不太擅长编程,特别是新语言,所以非常感谢任何帮助!

function google-sheets combinations permutation
3个回答
2
投票

这里有一个小的自定义函数,它创建的所有组合(它只是更容易为行编写):

function combinations(arr) {
  return arr.reduce(function(prod, row) {
    var out = [];
    for (i in row) {
      out = out.concat(prod.map(function(x) {
        return x.concat(row[i]);
      }));
    }
    return out;
  }, [[]]);
}

将它用作

=combinations(A2:D9)
会创建 4^8 个组合,每个组合的长度为 8,这不是您想要的。但是转置很容易:

=combinations(transpose(A2:D9))

上述函数将组合作为矩形数组返回,因此在您的示例中,输出将为 4 列宽。如果你想加入一个单元格中的组合(所以输出是一列),使用这个修改版本:

function joincombinations(arr) {
  return arr.reduce(function(prod, row) {
    var out = [];
    for (i in row) {
      out = out.concat(prod.map(function(x) {
        return x.concat(row[i]);
      }));
    }
    return out;
  }, [[]]).map(function(row) {
    return row.join("");
  });
}

用法:

=joincombinations(transpose(A2:D9))


1
投票

试试

=arrayformula(if(row(A:A)>4096,"",int((row(A:A)-1)/512)+1&mod(int((row(A:A)-1)/64),8)+1&mod(int((row(A:A)-1)/8),8)+1&mod(int((row(A:A)-1)/1),8)+1))

(工作表中至少需要 4096 行)。


0
投票

2023 年 5 月更新

序列可以用

sequence()
filter()
regexmatch()
非常有效地生成,像这样:

=let( 
  numbers, sequence(8888 - 1111 + 1, 1, 1111), 
  filter(numbers, not(regexmatch(to_text(numbers), "0|9"))) 
)
© www.soinside.com 2019 - 2024. All rights reserved.