其他答案似乎涵盖了所有基础。这些仅出于兴趣而提交:
c = b.cycle
#=> #<Enumerator: [0, 5, 5, 6, 1]:cycle>
a.map { |e| e + c.next }
#=> [1, 5, 7, 7, 7]
还有一种方式:
a.map { |e| e + b.rotate!.last }
#=> [1, 5, 7, 7, 7]
基准
较大数组的基准测试(我不会通过展示给自己任何好处)。
require 'fruity'
a = (1..10_000).to_a.shuffle
b = a.shuffle
compare do
sagar { ar = a.dup; br = b.dup; c = br.cycle; ar.map { |e| e + c.next } }
sagar_2 { ar = a.dup; br = b.dup; ar.map { |e| e + br.rotate!.last } }
cary { ar = a.dup; br = b.dup; ar.each_index.map { |i| ar[i]+br[i] } }
surya { ar = a.dup; br = b.dup; ar.zip(br).map{|v| v.reduce(:+) } }
surya_2 { ar = a.dup; br = b.dup; ar.map.with_index { |v, i| v + br[i] } }
sinsuren { ar = a.dup; br = b.dup; [ar, br].transpose.map {|x| x.reduce(:+)} }
flamine { ar = a.dup; br = b.dup; ar.map{|i| br.shift.to_i + i }}
stefan { ar = a.dup; br = b.dup; ar.zip(br).map { |i, j| i + j }}
end
#Running each test once. Test will take about 3 seconds.
#flamine is similar to surya_2
#surya_2 is similar to stefan
#stefan is similar to cary
#cary is faster than sinsuren by 3x ± 1.0
#sinsuren is similar to surya
#surya is faster than sagar by 2x ± 0.1
#sagar is faster than sagar_2 by 15x ± 1.0
运行了几次,有时 flamine 是最快的:flamine is faster than surya_2 by 10.000000000000009% ± 10.0%。需要注意的是,flamine 的技术将 b 修改为一个空数组。