Вычисление различий между элементами массива

Учитывая отсортированный массив из n целых чисел, например:

ary = [3, 5, 6, 9, 14]

Мне нужно рассчитать разницу между каждым элементом и следующим элементом в массиве. Используя приведенный выше пример, я получаю:

[2, 1, 3, 5]

Начальный массив может содержать 0, 1 или много элементов в нем, а числа, которые я буду обрабатывать, будут намного больше (я буду использовать временные метки эпохи). Я пробовал следующее:

times = @messages.map{|m| m.created_at.to_i}
left  = times[1..times.length-1]
right = times[0..times.length-2]
differences = left.zip(right).map { |x| x[0]-x[1]}

Но мое решение выше и не является оптимальным, а не идеальным. Может кто-нибудь дать мне руку?

Ответ 1

>> ary = [3, 5, 6, 9, 14] #=> [3, 5, 6, 9, 14]
>> ary.each_cons(2).map { |a,b| b-a } #=> [2, 1, 3, 5]

Edit: Заменен inject на map.

Ответ 2

Аналогичный, но более краткий:

[3, 5, 6, 9, 14].each_cons(2).collect { |a,b| b-a }

Ответ 3

Альтернатива:

a.map.with_index{ |v,i| (a[i+1] || 0) - v }[0..-2]

Не работает в Ruby 1.8, где map требуется блок вместо возврата Enumerator.