From: "Simon Kröger" Date: 2005-12-14T05:03:42+09:00 Subject: Re: Array.invert Christer Nilsson wrote: > Kroeger, Simon (ext) wrote: > >>Hi Christer, >> >>don't take this to serious: >> >>a = [[1,3],[1,4,5]] >>p (0...a.size).zip(a).inject([]){|s, b| b[1].each{|i| (s[i] ||= []) << >>b[0]}; s} >> >>=> [nil, [0, 1], nil, [0], [1], [1]] >> >>cheers >> >>Simon > > > Ruby is so fun, it's impossible to be serious :-) > > a.invert works but not a.invert.invert > > Can you fix that in your amazing oneliner ? > Clue: nil.each is the bummer. > > Christer rofl! i will give you two: class Array def invert zip([*(0...size)]).inject([]){|s, b| (b.first || []).each{|i| (s[i] ||= []) << b.last}; s} end end or (even worse): class Array def invert Array.new(flatten.compact.max.succ){|i| zip([*(0...size)]).find_all{|b, j| b && b.include?(i)}.transpose[1]} end end cheers Simon