go => Lists = [ [-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20], [ 0, 1, 2, 4, 6, 7, 8, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39], 1..20, [13], [11,12,13,15] ]. foreach(List in Lists) println(List), println(make_ranges(List)), nl end, nl. make_ranges(L) = Res => Ranges = [], Range = [L[1]], % Identify the range foreach(I in 2..L.length) Li1 = L[I-1], Li = L[I], if Li == Li1+1 then Range := Range ++ [Li] else if length(Range) > 0 then Ranges := Ranges ++ [Range] end, Range := [] ++ [Li] end end, % pickup the last range if length(Range) > 0 then Ranges := Ranges ++ [Range] end, Res := join([get_range(R) : R in Ranges], ","). % Convert to range representation get_range(R) = cond(R.length == 1, R.first().to_string(), min(R).to_string() ++ "-" ++ max(R).to_string()).