Gavin Kistner
9/13/2006 4:27:00 PM
From: Peter Booth [mailto:pbooth@marketaxess.com]
> Two parallel arrays A, B . For each element n of A for which
> f(An) is true,
> is g(B[n-3:n+3]) true? Where B[n-3:n+3] refers to seven
> elements of B whose
> position is centered over An' position.
>
> Can the block inside Enumerable#collect know it's position inside the
> Enumerable? Can one collect two parallel arrays?
#collect_with_index doesn't exist natively (but should)
#zip will merge the arrays, and then you can map the results.
module Enumerable
def map_with_index
a = []
each_with_index { |x, i|
a << yield( x, i )
}
a
end
end
class Array
def sum
inject(0){ |s,v| s+v }
end
end
def f( n )
n % 2 == 0
end
def g( *vals )
vals.sum
end
a = (1..10).to_a
b = (10..20).to_a
pairs = a.zip( b )
odd_sums = pairs.map_with_index{ |pair, i|
a_val = pair[ 0 ]
if f( a_val )
b_vals = pairs[ (i-3)..(i+3) ].map{ |pair| pair[1] }
g( *b_vals )
else
nil
end
}
p odd_sums
#=> [nil, 0, nil, 91, nil, 105, nil, 99, nil, 70]