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件)
- ホワイトペーパー
-
SOAの始め方 - 価値あるSOA実現のために
-
不確実な時代におけるデータウェアハウス投資 アプライアンス?カラムストア・データベース?
-
ソフトウェア開発業務における Software as a Service (SaaS) の有効性~コラブネット・ジャパン〜
-
SOA 対応 BPM を採用する際のベスト・オプションとは −WebSphere Process Server および WebSphere Integration Developer の概要
-
Microsoft製品の機能・性能をフルに引き出し、活用するための技能とノウハウを蓄積・提供している日立システム。業種や規模を問わず、お客様のビジネス基盤強化・企業価値向上をサポートします。
- 企画特集
そのストレージで仮想化に対応できますか?
ロリポップ!がリニューアル
中小企業のセキュリティリスクとは?
SOA、BPM、SaaS −今、企業に必要なこと
セキュリティ&ユーザ事例【SIer Club】
インターネット上の悪意を未然に防ぐには?
◆エン・ジャパン厳選求人☆毎週更新◆
ストレージメディア特設サイト開設
御社のログ活用しませんか!?
今注目の「サジェスト検索」−デモ掲載中
集積度も性能も、業界最高水準のブレードPC
パンデミック対策特集
ESBでIT投資の無駄を劇的に解消する
仮想環境を実現するソリューション特集
【徹底対談】運用管理ツールの賢い使い方
- エンタープライズにおけるSUSEの強み
- サービス・ドリヴン・データセンター
- ■ストレージ容量50%削減保証■
- サーバー監視・運用のコストを削減するには
- 話題のタグ
RIA
Tips
Firefox
Safari
ソフトウェア開発
Java
SOA
PHP
iPhone 3G
オープンソース
Webデザイン
仮想化
Linux
iPod touch
Chrome
リファレンス
Windows Vista
HTML
Opera
Google
ブラウザ
Off Topic
セキュリティ
モバイル
Ajax
小技
Firefox 3
アプリケーション
CSS
プログラミング言語
Webサービス
WebKit
Windows
Windows 7
開発環境
Internet Explorer
Database
OS
Mac OS X
Apple
Adobe
iPhone
ツール
データベース
Mozilla
脆弱性
Flash
JavaScript
Microsoft
UI
話題のタグを見る »
#1 sasashin - 2008/04/17 16:37:25
Windows 7はLinuxへの切替が簡単:注目の仮想ディスクフォーマット「VHD」
iPhone OS 3.0で変わった「絵文字」
OSSのクラウド基盤「Eucalyptus」を使う(4)--インストール〜ノード構築
俳優経験者が指南する「人前で上手く話すためのティップス10選」
「うるまでるびペイント」登場:絵は上手下手ではなく制作過程に楽しみが
待てば回路の日和あり--「iPhone 3GS」発売、しかし――