配列をユニークにしてその個数とともに返せ

配列をユニークにしてその個数とともに返せ - rubyco(るびこ)の日記
id:rubycoさんがやってる奴に、
Ruby歴が現場の勉強会初級編だけの私も乗ってみました。

配列をユニークにしてその個数とともに返せ。

具体的には、["foo", "bar", "foo", "baz", "bar", "foo"] を、[ ["foo", 3], ["bar", 2], ["baz", 1] ] にする。
golf - babie, you're my home

とりあえず(4)までは読ませてもらいました。
んで、a.eachは1回にしたいなあと

a = ["foo", "bar", "foo", "baz", "bar", "foo"]
h = Hash.new(0)
r = Hash.new(0)
p = []
a.each do |e|
  r[e]=r.length if h[e] == 0
  h[e] += 1
  p[r[e]] = '"' + e + '",' + h[e].to_s
end
puts '[[' + p.join('], [') +']]'

文字数(スペース抜き):167
ネストした配列がpでいい感じに出力されるのを知らないでやったのでひたすらキモイ。
とりあえずキモイところだけ修正

a = ["foo", "bar", "foo", "baz", "bar", "foo"]
h = Hash.new(0)
r = Hash.new(0)
p = []
a.each do |e|
  r[e]=r.length if h[e] == 0
  h[e] += 1
  p[r[e]] = [e,h[e]]
end
p p

文字数:130
hかrかどっちか消せないかなあと。

a = ["foo", "bar", "foo", "baz", "bar", "foo"]
r = Hash.new(0)
p = [""]
a.each do |e|
  if p[r[e]][0] != e
    r[e] = r.size
    p[r[e]] = [e,0]
  end
  p[r[e]][1] += 1
end
p p

文字数:129
ほとんど文字数減ってないです。
代入の戻り値は代入した値になるのを確認したので、if文からif修飾子に戻してやる。

a = ["foo", "bar", "foo", "baz", "bar", "foo"]
r = Hash.new(0)
p = [""]
a.each do |e|
  p[r[e] = r.size] = [e,0] if p[r[e]][0] != e
  p[r[e]][1] += 1
end
p p

文字数:122文字

行数は少なめになったけどごちゃごちゃしてるから文字数は結構多いです。
この方向で行くと行き詰まりそうなんで、また、もう少し勉強してから挑戦してみようかと。