假设我有数组[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_slice
,map
或inject
有一些聪明的方法可以做到这一点,但无法猜到它。
答案 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写的。