function spout(integer first, integer this, sequence s) string res if first=this-1 then res = sprintf("%d",s[first]) else res = sprintf("%d%s%d",{s[first],iff(first=this-2?',':'-'),s[this-1]}) end if return res end function function extract_ranges(sequence s) integer first = 1 string out = "" if length(s)!=0 then for i=2 to length(s) do if s[i]!=s[i-1]+1 then out &= spout(first,i,s)&',' first = i end if end for out &= spout(first,length(s)+1,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}))