Hash.newのブロックは戻り値を決めるだけで
勝手にはキーに登録してくれないから
ちゃんとキーに登録するように書けば#1と同じようになる

p a.inject(Hash.new{|h,k|h[k]=[]}){|map, x| map[x].concat([x]); map} #2
p a.inject(Hash.new{|h,k|h[k]=[]}){|map, x| map[x] << x; map} #3