[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Re: How to collect over two arrays then look back to one?

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]