Ruby で、連続した数列を範囲形式にまとめてみる

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

仕様

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

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

「Rubyでどう書く?:連続した数列を範囲形式にまとめたい」をやってみる - kenmazのはてな」経由


オイラならこう書くかなぁ(こっちの方がベターだ、という意味じゃないです)。

def nums2str_range(str)
nums = str.split(' ').map { |i| i.to_i }.uniq.sort
nums.inject([[nums.shift]]) { |r, s|
if r.last.last.succ == s
r.last << s
else
r << [s]
end
r
}.map { |i|
i.size > 1 ? [i.first, i.last].join('-') : i.first
}.join(', ') + '.'
end

str = '1 2 3 5 7 8'
puts nums2str_range(str) #=> 1-3, 5, 7-8.

str = '1 3 4 5 7'
puts nums2str_range(str) #=> 1, 3-5, 7.

一応解説。以下のような感じの事をやってます。
  1. 文字列を受け取って、半角スペースをデリミタにして配列へ変換(ついでに、重複を排除して、ソート)
  2. 数値が連続する部分ごとに配列を作成(以下のような感じ)
    [[1, 2, 3], [5], [7, 8]]
  3. 各配列ごとに、配列の長さが1より大きければ最初と最後の要素を取り出してハイフンで繋ぐ。



いじょ
[PR]
by fkmn | 2008-04-21 23:55
<< Super Mario Bro... 【感想】世界樹の迷宮II 諸王の聖杯 >>


とあるWebアプリケーションエンジニアの日記
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
カテゴリ
以前の記事
ブログパーツ
リンク
検索
タグ
最新のトラックバック
プログラミングが「出来る..
from とりあえず9JP?
Genographic ..
from ナンジャモンジャ
ジュセリーノ
from ありの出来事
くちこみブログ集(ライフ..
from くちこみブログ集(ライフ)(..
以降、丁寧語で行こう!
from エッセイ的な何か
その他のジャンル
ファン
記事ランキング
ブログジャンル
画像一覧

fkmnの最近読んだ本 フィードメーター - フッ君の日常 あわせて読みたい AX