Кто-то, вероятно, предложит более специализированное решение, но я бы просто уменьшил его
counts = [1,3,3].reduce({}) do |acc,n|
acc.tap do |a|
a[n] ||= 0
a[n] += 1
end
end
counts.each {|k,v| puts "#{k} was found #{v} times"}
(обратите внимание, что tap - ruby 1.9, и он поддерживается в activesupport)
вывод этого будет
1 найден 1 раз
3 было найдено 2 раза