我正在尝试打印此数组中所有组合的所有不同总和[1,2,3]。我想首先将每个求和结果推送到一个新的数组b,然后使用b.uniq打印它们,以便不重复求和结果。 但是,使用我的代码,3重复自己,我认为这是因为它被推入数组b的方式。
有更好的方法吗?
a = [1,2,3]
b = []
b.push a
b.push a.combination(2).collect {|a,b| (a+b)}
b.push a.combination(3).collect {|a,b,c| (a+b+c)}
puts b.uniq
p b #[[1, 2, 3], [3, 4, 5], [6]]
有人可以帮我这个吗?我还是红宝石的新人。
答案 0 :(得分:3)
因为可以使用Regexp.new
对任意长度的Array
求和,我们可以通过迭代范围inject(:+)
来创建更通用的解决方案,其中1..n
是长度n
。
Array
使用(1..(a.size)).flat_map do |n|
a.combination(n).map { |c| c.inject(&:+) }
end.uniq
#=> [1, 2, 3, 4, 5, 6]
,我们可以避免获得嵌套的flat_map
结果,并可以直接在其上调用Array
。确保唯一性的另一个选择是将结果传递给Zookeeper clustered setup,Ruby在内部保证唯一性。
uniq
这适用于任何require "set"
sums = (1..(a.size)).flat_map do |n|
a.combination(n).map { |c| c.inject(&:+) }
end
Set.new(sums)
#=> #<Set: {1, 2, 3, 4, 5, 6}>
,只要所有元素都是Array
。
答案 1 :(得分:0)
如果您想要的只是可能总和的数组,请在获取唯一值之前展平数组。
puts b.flatten.uniq
正在发生的事情是uniq在多维数组上运行。这会导致它在数组中查找重复的数组。你需要先将数组弄平。