33 lines
943 B
Elixir
33 lines
943 B
Elixir
function extract_ranges(sequence s)
|
|
integer first
|
|
sequence out
|
|
out = ""
|
|
if length(s) = 0 then
|
|
return out
|
|
end if
|
|
first = 1
|
|
for i = 2 to length(s) do
|
|
if s[i] != s[i-1]+1 then
|
|
if first = i-1 then
|
|
out &= sprintf("%d,", s[first])
|
|
elsif first = i-2 then
|
|
out &= sprintf("%d,%d,", {s[first],s[i-1]})
|
|
else
|
|
out &= sprintf("%d-%d,", {s[first],s[i-1]})
|
|
end if
|
|
first = i
|
|
end if
|
|
end for
|
|
if first = length(s) then
|
|
out &= sprintf("%d", s[first])
|
|
elsif first = length(s)-1 then
|
|
out &= sprintf("%d,%d", {s[first],s[$]})
|
|
else
|
|
out &= sprintf("%d-%d", {s[first],s[$]})
|
|
end if
|
|
return out
|
|
end function
|
|
|
|
puts(1, extract_ranges({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}))
|