计算二进制红宝石

Tas*_*sos 1 ruby arrays combinations

我有两个数组

[a0 b0 c0]

[a1 b1 c1]
Run Code Online (Sandbox Code Playgroud)

我想计算两者之间所有可能的总和.可能的总和仅包含每个列槽的1个元素.例如,可能的总和是

a0 + b1 + c1
Run Code Online (Sandbox Code Playgroud)

要么

a1 + b1 + c1
Run Code Online (Sandbox Code Playgroud)

但不是 a1 + a0 + b0 + c0

换句话说,示例中的总和将具有3个槽,每个槽仅具有两个阵列中的1个元件.从我的观点来看,这看起来像二进制计数,其中每个插槽只能取两个数字中的一个(0或1).所以在这个例子中

000表示总和中的所有元素都来自第一个数组

sum(000) = a0 + b0 + c0.
sum(111) = a1 + b1 + c1
sum(010) = a0 + b1 + c0
Run Code Online (Sandbox Code Playgroud)

你得到备忘录.

我想知道如何在ruby中做到这一点.我正在考虑一个复杂的解决方案,我计算二进制字符串,对于每个计数,我从数组中"选择"正确的元素.由于我想要所有可能的组合(2 ^ n),我可以在一行中编码或接近它吗?

Ale*_*kin 6

? a1 = [11,12,13]
#? [11, 12, 13]
? b1 = [21,22,23]
#? [21, 22, 23]
? a1.zip(b1).reduce(&:product).map(&:flatten)
#? [[11, 12, 13], [11, 12, 23], [11, 22, 13], [11, 22, 23], 
#?  [21, 12, 13], [21, 12, 23], [21, 22, 13], [21, 22, 23]]
? a1.zip(b1).reduce(&:product).map(&:flatten).map { |e| e.reduce &:+ }
#? [36, 46, 46, 56, 46, 56, 56, 66]
Run Code Online (Sandbox Code Playgroud)

UPD出于好奇,这是@pangpang用ruby编写的解决方案:

[0,1].repeated_permutation([a1.length, a2.length].min).map do |bits|
  bits.each_with_index.reduce(0) do |memo, (e, i)| 
    memo + (e.zero? ? a1[i] : a2[i])
  end
end
Run Code Online (Sandbox Code Playgroud)