Немного отличается и немного более быстрый вариант:
arr = [["Timmy", "90", "47", "89"], ["Simon", "89", "57", "99"]]
averages = arr.map do |name, *nums|
[name, nums.inject(0){|acc, el| acc + el.to_f}/nums.length]
end
p averages
# => [["Timmy", 75.33333333333333], ["Simon", 81.66666666666667]]
Использует inject
с аккумулятором, который изначально является 0. Затем добавить к нему каждый Num преобразуется в Float.
Бенчмаркинг:
require 'benchmark'
arr = [["Timmy", "90", "47", "89"], ["Simon", "89", "57", "99"]]
n = 1_000_000
Benchmark.bm do |x|
x.report("map.inject : ") { n.times do ; arr.map do |name, *nums| ; [name, nums.map(&:to_f).inject(:+)/nums.length] ; end ; end }
x.report("inject(acc): ") { n.times do ; arr.map do |name, *nums|; [name, nums.inject(0){|ac,el| ac +el.to_f}/nums.length]; end ; end }
end
#=> user system total real
#=> map.inject : 2.220000 0.000000 2.220000 ( 2.218477)
#=> inject(acc): 2.030000 0.000000 2.030000 ( 2.031263)
Среднее значение чисел в каждой подрешетке, или в среднем по всем подмассивам? – Linuxios
Среднее число в каждом подмассиве. Сожалею! – Destiny
Почему это звучит как домашнее задание? –