我想为 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 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))
试试
=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 行)。
序列可以用
sequence()
、filter()
和regexmatch()
非常有效地生成,像这样:
=let(
numbers, sequence(8888 - 1111 + 1, 1, 1111),
filter(numbers, not(regexmatch(to_text(numbers), "0|9")))
)