23 lines
542 B
OCaml
23 lines
542 B
OCaml
#load "str.cma"
|
|
|
|
let range a b =
|
|
if b < a then invalid_arg "range";
|
|
let rec aux i acc =
|
|
if i = b then List.rev (i::acc)
|
|
else aux (succ i) (i::acc)
|
|
in
|
|
aux a []
|
|
|
|
let parse_piece s =
|
|
try Scanf.sscanf s "%d-%d" (fun a b -> range a b)
|
|
with _ -> [int_of_string s]
|
|
|
|
let range_expand rng =
|
|
let ps = Str.split (Str.regexp_string ",") rng in
|
|
List.flatten (List.map parse_piece ps)
|
|
|
|
let () =
|
|
let rng = "-6,-3--1,3-5,7-11,14,15,17-20" in
|
|
let exp = range_expand rng in
|
|
List.iter (Printf.printf " %d") exp;
|
|
print_newline ()
|