配列をユニークにしてその個数とともに返せをHaskellで
もとはbabieさんとこでやっていたのをrubycoさんがやっているのを見て、やりたくなった。
ほんとは、rubyで書こうと思ったんだけど、inject使って、Hashでっていうのを書いた後に、それbabieさんがやってるじゃんということに気づきた。しかし、
["foo","bar","foo","baz","bar","foo"].inject(Hash.new(0)){|i,j|i[j]+=1}
が、
TypeError: can't convert String into Integer
をだしてくる意味に気づかんかった。
i[j]+=1
が、Hashオブジェクトを返してくると思っていたよ。
というわけで、急遽Haskellで素直に書いた。
Prelude List> map (\x-> (head x,length x))$group$sort ["foo","bar","foo","baz","bar","foo"] [("bar",2),("baz",1),("foo",3)]
77byte。しかし、Listモジュールを使っているから、ghci上なら":m List".lengthをプラスせねばならない。それに、babieさんの結果の順と違うから、ほんとはいけないのかもしれない。コメントのところに書かれているsumimさんのsmalltalkは、Listみたいにインポートしなくていいのかしら?それにしても、短く書けるなぁ。
いつもながら、golf系で出力せよって、シェルの出力に出力を任せてもいいのかしらと。あと、問題で決められた入力の部分の文字数はカウントすべきが、しないべきかも気になるんですよ。