どう書く?:連続した数列を範囲形式にまとめたい

チャレンジしてみるがうまくいかず。
下を見て納得。しかもきれい。
非常に勉強になった。


Rubyでどう書く?:連続した数列を範囲形式にまとめたい - builder by ZDNet Japan

>sawaさん
#  "2 8 5 4 6 2 5"  => "2, 4-6, 8."

a = $*[0].split(/\s+/).map{|i| i.to_i}.sort

p a.inject([] << [a.shift]){|b, e|
  case e
  when b.last.first, b.last.last
  when b.last.last + 1;    b.last[1] = e
  else     b << [e]
  end
b}.map {|i| i.join('-')}.join(', ') + '.'

今回理解したこと

  • 空白で区切って配列

 split(" ") と書いてしまっていたが split(/\s+/) と書いた方がよい。

  • map

 to_i をここで一気にやるために map を使う。なるほど。
 最後の配列の入れ子を出力するところも、mapを使ってすっきり書ける。

  • inject

 結果に配列を使用するには、こう書けばいいのか。
 出力前のデータとして、配列の入れ子を使うというのがイメージできなかった。


とっても勉強になりました。