Rubyでどう書く?:連続した数列を範囲形式にまとめたい
三浦義太郎(KBMJ)
2008/04/17 08:00
「連続した数列を範囲形式にまとめたい」と題しまして、並んだ数字を確認用にわかりやすくする為に、ソートされた数字の列をハイフンで繋ぐ方法を解説したいと思います。
問題
並んだ数字を確認用にわかりやすくする為に、ソートされた数字の列をハイフンで繋ぐにはどうすればよいでしょうか?
数列は見づらいものです。ただ数字を並べているだけでは、ソートしてもどの数字が抜けているかを判断するために、順に目で追ってチェックする必要があります。
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
ほかによい方法があればコメントしてみてください。
- 特集: Rubyでどう書く? (7件)
- 今日のトップ記事
- 昨日
- 5日前
- 6日前
- 7日前
- ホワイトペーパー
- 話題のタグ
Off Topic
Safari
オープンソース
プログラミング言語
Chrome
Microsoft
開発環境
アプリケーション
データベース
Firefox 3
Webデザイン
Tips
iPhone
RIA
マイクロソフト
脆弱性
Apple
Internet Explorer
ブラウザ
リファレンス
小技
インストール
Ajax
WebKit
iPhone 3G
クラウド
UI
Windows 7
Mozilla
Opera
仮想化
Java
Windows
セキュリティ
iPod touch
Windows Vista
Firefox
Windows XP
Flash
Mac OS X
Database
モバイル
ソフトウェア開発
HTML
CSS
Webサービス
JavaScript
OS
Linux
Google
話題のタグを見る »
#1 sasashin - 2008/04/17 16:37:25
「Google Chrome」の拡張機能、開発者からのアップロード受付を開始
IMAPでGmailを受信、最も手っ取り早いのは?Windows 7、Ubuntu 9.10、Snow Leopardのメーラー比較
Snow LeopardではNTFSをサポート--その源流を訪ねる(2)
MS運営のオープンソース開発プロジェクト支援サイト「CodePlex」を探検する(2)
Snow LeopardではNTFSをサポート--その源流を訪ねる(1)
フォトレポート:「Windows Server 2008 R2」--あまり知られていない有用な機能10選
電力に"ふた"をする独自の省エネ機能とは!?
【最終警告】パンデミック対策特集
大丈夫?あなたの会社のセキュリティ対策
100万円で実現!中小企業の情報漏えい対策
企業ITシステムの企画、構築、運用のイロハ
高まるiSCSIストレージへの注目度
―エン・ジャパン厳選求人☆毎週更新―