# Re: Array.invert

**URL:** <https://www.ruby-forum.com/t/re-array-invert/100320>\
**Category:** Ruby\
**Created:** [December 13, 2005, 5:14pm UTC](https://www.ruby-forum.com/t/re-array-invert/100320 "2005-12-13T17:14:43Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![KroegerS\_Simon\_Sext](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/57b2e6/32.png) [@KroegerS\_Simon\_Sext](https://www.ruby-forum.com/u/KroegerS_Simon_Sext)\
**Post date:** [December 13, 2005, 5:14pm UTC](https://www.ruby-forum.com/t/re-array-invert/100320/1 "2005-12-13T17:14:43Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![KroegerS\_Simon\_Sext](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/57b2e6/32.png) [@KroegerS\_Simon\_Sext](https://www.ruby-forum.com/u/KroegerS_Simon_Sext)\
**Post date:** [December 13, 2005, 6:10pm UTC](https://www.ruby-forum.com/t/re-array-invert/100320/2 "2005-12-13T18:10:43Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![KroegerS\_Simon\_Sext](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/57b2e6/32.png) [@KroegerS\_Simon\_Sext](https://www.ruby-forum.com/u/KroegerS_Simon_Sext)\
**Post date:** [December 14, 2005, 12:34am UTC](https://www.ruby-forum.com/t/re-array-invert/100320/3 "2005-12-14T00:34:43Z")

</div>

Simon wrote:

> 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

I didn’t know invert was so complex that ten keywords were needed!  
The more keywords, the more cycles.  
My original old fashioned fortran style polyliner is still quickest 🙂

Christer

---

<div class="post-metadata">

**Author:** ![KroegerS\_Simon\_Sext](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/57b2e6/32.png) [@KroegerS\_Simon\_Sext](https://www.ruby-forum.com/u/KroegerS_Simon_Sext)\
**Post date:** [December 13, 2005, 9:04pm UTC](https://www.ruby-forum.com/t/re-array-invert/100320/4 "2005-12-13T21:04:07Z")

</div>

Christer N. wrote:

> > =\> [nil, [0, 1], nil, [0], [1], [1]]  
> > 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

---

<div class="post-metadata">

**Author:** ![KroegerS\_Simon\_Sext](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/57b2e6/32.png) [@KroegerS\_Simon\_Sext](https://www.ruby-forum.com/u/KroegerS_Simon_Sext)\
**Post date:** [January 1, 2006, 9:33pm UTC](https://www.ruby-forum.com/t/re-array-invert/100320/5 "2006-01-01T21:33:47Z")

</div>

Hi –

On Wed, 14 Dec 2005, Simon KrÃ¶ger wrote:

> > >
> 
> def invert  
> zip([\*(0…size)]).inject([]){|s, b| (b.first || []).each{|i| (s[i] ||=  
> []) \<\< b.last}; s}  
> end  
> end

You could also do: b.first.to\_a, which will be [] for nil and self if  
b.first is an array.

David

–  
David A. Black  
removed\_email\_address@domain.invalid

“Ruby for Rails”, forthcoming from Manning Publications, April 2006!
