ランプの中身(Ruby on Railsのシステム開発)
ランプの中身(Ruby on Railsのシステム開発)では、株式会社ケイビーエムジェイのRuby on Railsエンジニアが蓄積したノウハウを公開しています。Ruby on Railに関する技術解説や実践的なノウハウなど、開発現場の技術に則したコンテンツを随時追加していきます。 初心者の方でもわかりやすい技術解説を心がけています。リクエスト、ご質問も受け付けいますので、お気軽にコメントを記述して下さい。

< サーバ監視ソフトウェ... |  メイン | Rubyでどう書く?:RubyでPDF履... >

ZDnetで連載Ruby記事
2008.04.24

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

KBMJがZDnetで連載している記事を紹介します。コメントなどありましたらそちらでお願いします。

Rubyでどう書く?:連続した数列を範囲形式にまとめたい   三浦義太郎(KBMJ)

「連続した数列を範囲形式にまとめたい」と題しまして、並んだ数字を確認用にわかりやすくする為に、ソートされた数字の列をハイフンで繋ぐ方法を解説したいと思います。

問題

 並んだ数字を確認用にわかりやすくする為に、ソートされた数字の列をハイフンで繋ぐにはどうすればよいでしょうか?

 数列は見づらいものです。ただ数字を並べているだけでは、ソートしてもどの数字が抜けているかを判断するために、順に目で追ってチェックする必要があります。

 ruby ではそういった配列をわかりやすく表現する為に「1...3」と表現する方法が用意されているのですが、利用者は、「1 2 3 5」というような数字の羅列を入れてくるかもしれません。さて、rubyでこれらをハイフンで繋ぐためにはどのように処理する必要があるでしょうか。

 

仕様

  • 数値は、半角スペースで区切られた文字列で渡されます。
  • 続いている部分は、最初の数値と最後の数値を-(ハイフン)で繋いだ表記にします。
  • 連続が1回の場合(前の数も後ろの数も連続でない)は、-(ハイフン)では繋ぎません。
  • 出力は、「,」(カンマ)と半角スペースで区切られた文字列でなければなりません。

 

  • "1 2 3" => "1-3."
  • "1 2 3 5 7 8" => "1-3, 5, 7-8."
  • "1 3 4 5 7" => "1, 3-5, 7."

 

回答例

a = $*[0].split(' ').map{|i|i.to_i}+[nil]
i
= a[0]
p a
.inject([a[0].to_s]){|r, v|
 
if i != v
   r
<< r.pop + "-#{i-1}" if 2 <= i - r.last.to_i
   
break r unless v
   i
= v
   r
<< i.to_s
 
end
 i
+=1
 r
}.join(', ')+'.'

 

判 定用の変数を配列の値と違うものになるまで増分していき、連続を判定しています。連続でなくなった段階で配列の値を出力用の配列と判定用の変数に入れて 同様の処理を繰り返していきます。判定用の変数の値と出力用の配列の最後の値(連続開始の値)の差が2以上の場合に「-[数字]」の文字列を追加します。

 

  • $*にはコマンドライン引数の値の配列が入ります。
  • injectは以前のブロックの実行結果を引数と受け取って順次処理していくことができる関数です。あまり使われていないようですが、結構便利な関数です。


p [1,2,3,4,5].inject(0) {|result, item| result + item } => 15
 
 ほかによい方法があればコメントしてみてください。 (コメントはこちら
 
 

 

コメント (0)  |トラックバック (0)

ブックマークに追加する

トラックバック URL

この記事にコメントする

ニックネーム:
メールアドレス:
URL:


KBMJのWebソリューション
Ruby on Rails Summer Festival 2008開催決定!!

TOPICS

2008/08/14
ZD Net Builder」の連載記事です。第七回は「Rubyでどう書く?:RubyCocoa+Core Animationでお手軽アニメーション」が掲載されました。

2008/08/06
ZD Net Builder」の連載記事です。第六回は「Rubyでどう書く?特別編:Matzからのお題」が掲載されました。

2008/07/29
アットマーク・アイティ」にケータイWebアプリ開発、9つの注意点が掲載されました。

2008/07/11
ZD Net Builder」の連載記事です。第五回は「Rubyでどう書く?:RubyでWord文書を作成する」が掲載されました。

全体のRoR最新ブログ一覧

プロフィール

  • goto
  • 23 歳
  • 毎週KBMJでは、"ZDnet"にRubyの記事を連載しています。
    ここでは、その記事を紹介します。

ブログの購読

RSS

timelog
株式会社ケイビーエムジェイロゴ