procedure main() R := [ 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 ] write("Input list := ",list2string(R)) write("Extracted sting := ",s := range_extract(R) | "FAILED") end procedure range_extract(R) #: return string/range representation of a list of unique integers local s,sep,low,high,x every if integer(x:= !R) ~= x then fail # ensure all are integers, R := sort(set(R)) # unique, and sorted s := sep := "" while s ||:= sep || ( low := high := get(R) ) do { # lower bound of range sep := "," while high := ( R[1] = high + 1 ) do get(R) # find the end of range if high > low+1 then s ||:= "-" || high # - record range of 3+ else if high = low+1 then push(R,high) # - range of 2, high becomes new low } return s end procedure list2string(L) #: helper to convert list to string local s every (s := "[ ") ||:= !L || " " return s || "]" end