func rangeFormat(a) { if a.Length() == 0 { return "" } var parts = [] var n1 = 0 while true { var n2 = n1 + 1 while n2 < a.Length() && a[n2] == a[n2-1]+1 { n2 += 1 } var s = a[n1].ToString() if n2 == n1+2 { s += "," + a[n2-1] } else if n2 > n1+2 { s += "-" + a[n2-1] } parts.Add(s) if n2 == a.Length() { break } if a[n2] == a[n2-1] { throw "Sequence repeats value \(a[n2])" } if a[n2] < a[n2-1] { throw "Sequence not ordered: \(a[n2]) < \(a[n2-1])" } n1 = n2 } return String.Join(values: parts) } var rf = rangeFormat([ 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 ]) print("range format: \(rf)")