RosettaCodeData/Task/Range-extraction/Icon/range-extraction.icon

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