「Rubyでどう書く?」に答えてみます。Part.1
Rubyでどう書く?:連続した数列を範囲形式にまとめたい - builder by ZDNet Japanの課題に答えてみました。課題の内容はZDNetの記事を見てください。
他の人の回答はすごい短いんだけど、なんかよく読みづらかったので、僕は Array のメソッドとして separate_to_range というのを用意して、内部的に Range を使うようにして実装してみました。返ってくる値も Range を含んだ Array なので、扱いやすいはず。
ただ、ちょっと長過ぎるかなぁ?
-
class Array
-
def range_or_fixnum(first,last)
-
first <last ? Range.new(first,last) : first
-
end
-
-
def separate_to_range
-
tmp_arr = []
-
inject([]) do |result, value|
-
tmp_arr <<value
-
if tmp_arr.last - tmp_arr.first> tmp_arr.size - 1
-
result <<range_or_fixnum( tmp_arr.first, tmp_arr[tmp_arr.size-2] )
-
tmp_arr = [value]
-
end
-
result <<range_or_fixnum( tmp_arr.first, tmp_arr.last ) if value == last
-
result
-
end
-
end
-
end
使うときはこんな感じです。
-
arr = "0 1 2 5 6 10".split(/\s+/).map{|i| i.to_i}
-
puts arr.separate_to_range.join(", ").gsub("..", "-")











