RAILS PRESS RUBY on RAILS, it’s DRY and COOL …

RSS Feed

RAILS PRESS RSS

Tag Cloud

はてなブックマーク - railspress.matake.jp の注目エントリー
象形文字くさび形文字ミイラそろばんの玉そろばんコーラン占いの板?象牙大英博物館
Tagged by Builder

Posted on
2008/09/21

Tags
Builder, 連載

0 Comment

この記事をはてなブックマークに登録 この記事のはてなブックマーク数 この記事を livedoor クリップに登録この記事の livedoor クリップ数 このエントリを del.icio.us に追加
ブックマークに追加する

「Rubyでどう書く?」に答えてみます。Part.1

Rubyでどう書く?:連続した数列を範囲形式にまとめたい - builder by ZDNet Japanの課題に答えてみました。課題の内容はZDNetの記事を見てください。

他の人の回答はすごい短いんだけど、なんかよく読みづらかったので、僕は Array のメソッドとして separate_to_range というのを用意して、内部的に Range を使うようにして実装してみました。返ってくる値も Range を含んだ Array なので、扱いやすいはず。

ただ、ちょっと長過ぎるかなぁ?

LANG : RUBY
  1. class Array
  2.   def range_or_fixnum(first,last)
  3.     first <last ? Range.new(first,last) : first
  4.   end
  5.  
  6.   def separate_to_range
  7.     tmp_arr = []
  8.     inject([]) do |result, value|
  9.       tmp_arr <<value
  10.       if tmp_arr.last - tmp_arr.first> tmp_arr.size - 1
  11.         result <<range_or_fixnum( tmp_arr.first, tmp_arr[tmp_arr.size-2] )
  12.         tmp_arr = [value]
  13.       end
  14.       result <<range_or_fixnum( tmp_arr.first, tmp_arr.last ) if value == last
  15.       result
  16.     end
  17.   end
  18. end

使うときはこんな感じです。

LANG : RUBY
  1. arr = "0 1 2 5 6 10".split(/\s+/).map{|i| i.to_i}
  2. puts arr.separate_to_range.join(", ").gsub("..", "-")


Builderタグ