间隔由它们的边界给出为数组[a,b]和[x,y]。我想计算它们之间的交叉长度。根据此页面:http://world.std.com/~swmcd/steven/tech/interval.html
如果
,我可以告诉它是0(not (a < y && x < b))
成立。
例如,区间[1.2,4.3]和[2.1,5.5]交叉点长度为4.3 - 2.1 = 2.2
答案 0 :(得分:6)
这应该这样做。
<强>代码强>
def length(a,b,p)
[[a.last,b.last].min - [a.first,b.first].max,0].max.round(p)
end
<强>实施例强>
答案 1 :(得分:0)
这是同一问题的OO解决方案。我建议构建一个自定义的Interval
类,但这个实现只是一个例子,提问者应该根据他的实际情况考虑一下:
class Interval
attr_reader :range
def initialize range
@range = if range.nil? then nil else
fail TypeError, "Begin greater than end!" if range.begin > range.end
Range.new( range.begin, range.end )
end
end
def - other
begin
self.class.new [ range.begin, other.range.begin ].max ..
[ range.end, other.range.end ].min
rescue TypeError
self.class.new nil
end
end
def size
range.nil? ? 0 : range.end - range.begin
end
end
def Interval a, b # a convenience constructor
Interval.new a .. b
end
( Interval( 1.2, 4.3 ) - Interval( 2.1, 5.5 ) ).size
#=> 2.199999999999997
答案 2 :(得分:0)
仅供将来参考 - 在MySQL
Cary的回答是(没有舍入部分):
GREATEST( LEAST(`a_last`, `b_last`) - GREATEST(`a_first`, `b_first`), 0 )