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

Reply via email to