Dato un array ordinato di n numeri interi, come il seguente:calcolare le differenze tra gli elementi dell'array
ary = [3, 5, 6, 9, 14]
ho bisogno di calcolare la differenza tra ogni elemento e l'altro elemento della matrice. Utilizzando l'esempio precedente, avrei finito con:
[2, 1, 3, 5]
La matrice può avere inizio 0, 1 o più elementi in essa, ei numeri sarò trattamento sarà molto più grande (sarò utilizzando timestamp di epoca). Ho provato il seguente:
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]}
Ma la mia soluzione di cui sopra non è né ottimale, né ideale. Qualcuno può darmi una mano?
Questo è incredibilmente conciso. Grazie per la fantastica risposta. –
Bello! Prima non conoscevo 'each_cons'. Questa è una versione un po 'più breve della stessa: 'ary.each_cons (2) .map {| a, b | b-a} '. – Heikki
Come nota a margine: è importante dare un nome alle astrazioni: [(a, b), (b, c), (c, d), ...] sono chiamate "combinazioni a coppie". E infatti enumerable.each_cons (2) .map è il modo migliore per farlo in Ruby (grazie agli enumeratori tutti i metodi each_xyz possono ora essere usati "funzionalmente") – tokland