連続した数列を範囲形式にまとめたい
仕様
http://builder.japan.zdnet.com/sp/ruby-doukaku-panel/story/0,3800086254,20369264,00.htm
* 数値は、半角スペースで区切られた文字列で渡されます。
* 続いている部分は、最初の数値と最後の数値を-(ハイフン)で繋いだ表記にします。
* 連続が1回の場合(前の数も後ろの数も連続でない)は、-(ハイフン)では繋ぎません。
* 出力は、「,」(カンマ)と半角スペースで区切られた文字列でなければなりません。
Haskellでやってみた。
import System.Environment range [] = [] range (x:xs) = case range xs of [y]:r | x==y-1 -> [x,y]:r [y,z]:r | x==y-1 -> [x,z]:r r -> [x]:r join x = foldl1 ((++).(++x)) main = putStrLn.join ", ".map(join "-".map show).range.map read.words.head =<< getArgs
実行結果
% runghc range.hs '1 2 3 5 7 8 9 12 15 16' 1-3, 5, 7-9, 12, 15-16
全部mainにつっこんだ別解
import System.Environment main = putStrLn.foldl1((++).(++", ")).map(foldl1((++).(++"-")).map show).foldr(\x s->case s of [y]:r | x==y-1 -> [x,y]:r [y,z]:r | x==y-1 -> [x,z]:r r -> [x]:r )[].map read.words.head =<< getArgs