As a quick ref, here's the q&d ruby script I'm using
for the merging algo:
aa = ["1-1", "100-200", "1000-2000", "950-1050", "980-3000", "50-70", "5000-6000", "6001-7000", "4000-6000", "10-4000"]
aa = ["5000-6000", "6001-7000"]
in_merge = false
ostart = 0
oend = 0
num_ranges = 0
ret = ""
overlaps = 0
reversals = 0
aa.each do |s|
skip = false
i = s.split(/-/)
start = i[0].to_i
iend = i[1].to_i
puts "looking at #{start} - #{iend} (#{ostart}-#{oend})"
if !in_merge
ostart = start
oend = iend
in_merge = true
skip = true
end
if !skip
in_merge = false
if !(iend <= ostart && start-1 >= oend)
if start < ostart
puts " New start: #{start} was #{ostart}"
ostart = start
reversals+=1
in_merge = true
elsif start < oend || start == ostart
in_merge = true
end
if iend >= oend && (start-1) <= oend
puts " New end: #{iend} was #{oend}"
oend = iend
in_merge = true
elsif iend > ostart && iend <= oend
in_merge = true
end
else
puts " Skipped (#{iend} < #{ostart} || #{start-1} >= #{oend})"
end
if in_merge
overlaps+=1
else
ret << "#{ostart}-#{oend},"
num_ranges+=1
in_merge = true
ostart = start
oend = iend
end
end
end
if in_merge
ret << "#{ostart}-#{oend},"
num_ranges+=1
end
puts ret