From 702981264aa8fffef25a441dd953aad570697058 Mon Sep 17 00:00:00 2001 From: khiav reoy Date: Wed, 21 Oct 2020 12:29:04 +0800 Subject: [PATCH 1/3] add difference_with_other_multi_range --- lib/multi_range.rb | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/multi_range.rb b/lib/multi_range.rb index 925fdc9..3b75f3b 100644 --- a/lib/multi_range.rb +++ b/lib/multi_range.rb @@ -49,11 +49,7 @@ def merge_overlaps(merge_same_value = true) end def -(other) - if other.is_a?(MultiRange) - new_multi_range = dup - other.ranges.each{|range| new_multi_range -= range } - return new_multi_range - end + return difference_with_other_multi_range(other) if other.is_a?(MultiRange) new_ranges = @ranges.dup @@ -160,4 +156,10 @@ def can_combine?(range1, range2, merge_same_value) return range1.end >= range2.begin if @is_float return range1.end + 1 >= range2.begin end + + def difference_with_other_multi_range(other) + new_multi_range = dup + other.ranges.each{|range| new_multi_range -= range } + return new_multi_range + end end From 4d19bd3984bcb00bc2c4c3d7e58a39dabc20ff69 Mon Sep 17 00:00:00 2001 From: khiav reoy Date: Wed, 21 Oct 2020 12:32:01 +0800 Subject: [PATCH 2/3] add possible_sub_ranges_of method --- lib/multi_range.rb | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/lib/multi_range.rb b/lib/multi_range.rb index 3b75f3b..6f102ad 100644 --- a/lib/multi_range.rb +++ b/lib/multi_range.rb @@ -62,19 +62,7 @@ def -(other) next if other.begin > range.end # 大於這個 range break if other.end < range.begin # 小於這個 range - sub_range1 = range.begin...other.begin - - sub_range2_begin = if other.exclude_end? - other.end - else - other.end + (other.end.is_a?(Float) ? Float::EPSILON : 1) - end - sub_range2 = range.exclude_end? ? sub_range2_begin...range.end : sub_range2_begin..range.end - - sub_ranges = [] - sub_ranges << sub_range1 if sub_range1.begin <= sub_range1.end - sub_ranges << sub_range2 if sub_range2.begin <= sub_range2.end - + sub_ranges = possible_sub_ranges_of(range, other) new_ranges[idx + changed_size, 1] = sub_ranges changed_size += sub_ranges.size - 1 break if other.end <= range.end # 沒有超過一個 range 的範圍 @@ -162,4 +150,21 @@ def difference_with_other_multi_range(other) other.ranges.each{|range| new_multi_range -= range } return new_multi_range end + + def possible_sub_ranges_of(range, other) + sub_range1 = range.begin...other.begin + + sub_range2_begin = if other.exclude_end? + other.end + else + other.end + (other.end.is_a?(Float) ? Float::EPSILON : 1) + end + + sub_range2 = range.exclude_end? ? sub_range2_begin...range.end : sub_range2_begin..range.end + + sub_ranges = [] + sub_ranges << sub_range1 if sub_range1.begin <= sub_range1.end + sub_ranges << sub_range2 if sub_range2.begin <= sub_range2.end + return sub_ranges + end end From 303ce973643a18647e08753820cfcb9637ed5abd Mon Sep 17 00:00:00 2001 From: khiav reoy Date: Wed, 21 Oct 2020 12:35:43 +0800 Subject: [PATCH 3/3] add overlaps_with_range? method --- lib/multi_range.rb | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/multi_range.rb b/lib/multi_range.rb index 6f102ad..ab152d0 100644 --- a/lib/multi_range.rb +++ b/lib/multi_range.rb @@ -52,10 +52,7 @@ def -(other) return difference_with_other_multi_range(other) if other.is_a?(MultiRange) new_ranges = @ranges.dup - - return MultiRange.new(new_ranges) if new_ranges.empty? - return MultiRange.new(new_ranges) if other.begin > @ranges.last.end # 大於最大值 - return MultiRange.new(new_ranges) if other.end < @ranges.first.begin # 小於最小值 + return MultiRange.new(new_ranges) if not overlaps_with_range?(other) changed_size = 0 @ranges.each_with_index do |range, idx| @@ -167,4 +164,11 @@ def possible_sub_ranges_of(range, other) sub_ranges << sub_range2 if sub_range2.begin <= sub_range2.end return sub_ranges end + + def overlaps_with_range?(range) + return false if @ranges.empty? + return false if range.begin > @ranges.last.end # larger than maxinum + return false if range.end < @ranges.first.begin # smaller than mininum + return true + end end