Nicely done. That’s my answer, too. Here’s my code (also in Ruby):

puts (0..400).
collect{|i|Time::new(i,2,29)}.
reject{|t|t.day==1}.
collect{|t|t.strftime('%a')}.
group_by{|d|d}.
collect{|k,v|[k,v.length]}.
sort_by{|k,v|v}.reverse.
collect{|k,v|"%s - %d"%[k,v]}.
join("\n")

It’s a little sloppy: I could have taken some more-elegant shortcuts.