2010-04-09 6 views

ответ

4

Возможно, не самый быстрый, но, вероятно, среди кратчайшее:

Hash[ 
    keys.flatten.uniq.map{|e| 
    [e, keys.map{|ar| ar.count(e)}] 
    } 
] 
=> {"a"=>[2, 1], "b"=>[1, 1], "c"=>[0, 1]} 

или

keys.flatten.uniq.inject({}){|acc,e| 
    acc.merge({e => keys.map{|ar| ar.count(e)}}) 
} 

Вот выстрел в 1.8.6 версии:

keys.flatten.uniq.inject({}){|acc,e| 
    acc[e] = keys.map{|ar| 
    ar.select{|c| c==e}.size 
    } 
    acc 
} 

Но вам лучше получить этот запасной камень быстро ...;)

+0

Работы. Было бы еще более здорово, если бы он работал с Ruby 1.8.6 – Shreyas

+1

Чтобы сделать это (или что-нибудь еще, что работает в 1.8.7) работают в Ruby 1.8.6: 'требуют 'backports'' –