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