rubyでuniq -c

rubyでuniq -cをやる

>> [1,2,2,1,2,3,4,2,1,2,4,3,1,3].inject(Hash.new(0)){|r,i|r[i]+=1;r}
=> {1=>4, 2=>5, 3=>3, 4=>2}

最後にrを評価するのではまった。

>> {1=>2}[1]+=1
=> 3

だもんな…

別解

>> [4,1,2,2,1,2,3,4,2,1,2,4,3,1,3].group_by{|i|i}.map{|k,v|[k,v.size]}
=> [[4, 3], [1, 4], [2, 5], [3, 3]]

injectの勝ち

追記 2011/06/18 00:18:57:

$ ruby18 -vlne '(h||=Hash.new(0))[$_]+=1;END{for k,v in h do print k," ",v end}' A
ruby 1.8.7 (2008-10-14 revision 18426) [i686-linux]
yahoo 2
google 1
goo 1
msn 2

以前にメーリングリストであったらしい。

 (h||=Hash.new(0))[$_]+=1

これはすごいな。||= の使い方わすれてた。