gpt4 book ai didi

ruby - 如何创建从多个数组中选择的单个元素的每个组合?

转载 作者:数据小太阳 更新时间:2023-10-29 08:14:55 26 4
gpt4 key购买 nike

我有 5 个数组:

["A", "B", "C"]
["A", "B", "C", "D", "E"]
["A"]
["A", "B", "C", "D", "E", "F"]
["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O"]

我想创建每个组合的列表:

["AAAAA","AAAAB","AAAAC", "AAAAD"...
"BAAAA","BAAAB","BAAAC", "BAAAD"...]

最佳答案

a = [
["A", "B", "C"],
["A", "B", "C", "D", "E"],
["A"],
["A", "B", "C", "D", "E", "F"],
["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O"]
]

a.inject(&:product).map(&:join)
# => ["AAAAA", "AAAAB", "AAAAC", ..., "CEAFM", "CEAFN", "CEAFO"]

感谢 bluexuemei 改进答案。最初的解决方案是 a.shift.product(*a).map(&:join)


更传统的解决方案

有了这么方便的库,这些 ruby​​ 单行代码看起来几乎像是在作弊。

这里有一个更传统的方法来解决这个可以很容易地编码成其他编程语言的常见问题:

N = a.reduce(1) { |product,list| product * list.size } # 1350

combinations = []
0.upto(N-1) do |q|
combo = []
a.reverse.each do |list|
q, r = q.divmod list.size
combo << list[r]
end
combinations.push combo.reverse.join
end
combinations
# => ["AAAAA", "AAAAB", "AAAAC", ..., "CEAFM", "CEAFN", "CEAFO"]

基本思想是首先计算组合的总数N,它恰好是所有列表长度的乘积。从 0N-1 的每个整数然后将提供唯一索引所需的所有信息编码到每个列表中以生成每个组合。一种思考方式是索引变量q可以表示为一个5位数字,其中每个数字在不同的基数中,其中基数是对应列表的大小。也就是说,第一位是 base-3,第二位是 base-5,第三位是 base-1(始终为 0),第四位是 base-6,第五位是 base-15。要从 q 中提取这些值,这只是采用一系列重复的整数除法和余数,就像在内部循环中所做的那样。当然,这需要做一些功课,也许要看更简单的例子,才能完全消化。

关于ruby - 如何创建从多个数组中选择的单个元素的每个组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22242770/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com