拆分数组,平均子数组,返回新的平均数组?

时间:2015-03-10 19:24:39

标签: ruby

假设我有数组[35, 20, 15, 22, 18, 40, 16, 40]。 8位数。

我想要的是一个4位数组,其中每个数字是第一个数组中平均两位数的结果。

所以它是[(average of 35 and 20), (average of 15 and 22), (average of 18 and 40), (average of 16 and 40)]

我强烈怀疑使用each_slicemapinject有一些聪明的方法可以做到这一点,但无法猜到它。

2 个答案:

答案 0 :(得分:3)

你说得对:

[35, 20, 15, 22, 18, 40, 16, 40]
  .each_slice(2)
  .map {|pair| pair.inject(:+) / pair.length.to_f }

each_slice(2)生成最多2个元素的切片,然后可以求和,除以切片的长度。

答案 1 :(得分:0)

假设数组包含偶数个元素,我相信这是有意的,这是FORTRAN IV的方法:

arr = [35, 20, 15, 22, 18, 40, 16, 40]

(0...arr.size).step(2).map { |i| (arr[i]+arr[i+1])/2.0 }
  #=> [27.5, 18.5, 29.0, 28.0]

和另一个受FORTH +启发的:

def ex(op, v0, v1)
  v1.send op, v0
end

a = arr.dup
stack = []
while a.any?
  stack.unshift(a.pop)
  stack.unshift(a.pop)
  stack.unshift(:+)
  stack.unshift(ex(stack.shift, stack.shift, stack.shift))
  stack.unshift(2.0)
  stack.unshift(:/)
  stack.unshift(ex(stack.shift, stack.shift, stack.shift))
end
stack
  #=> [27.5, 18.5, 29.0, 28.0]

嗯。为什么我认为FORTH + 1 太酷了? Leo Brodie的书 Starting Forth 可能与它有很多关系。

1历史记录:Lotus 1-2-3克隆VP-Planner是由朋友Kent Brothers在FORTH写的。