34 lines
1.1 KiB
Plaintext
34 lines
1.1 KiB
Plaintext
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
|