我想在Ruby中找到两点的交集。应该进行何种类型的检查,以便该功能适用于所有情况。
伪代码是
交叉点(range1,range2)
notCommonR1 =范围1的一部分,不常见
common =两个范围之间的共同部分
notCommonR2 =范围2的一部分,不常见
例如
intersection([0, 3], [2, 4]) == {
:range1 => [[0, 2]],
:both => [2, 3],
:range2 => [[3, 4]]
}
答案 0 :(得分:1)
这是相当简单的;这里没有特别的检查;唯一的特例是如果范围之间没有共同部分。
def intersection(a, b)
# Sort so that a1 < a2, b1 < b2, a1 < b1
a, b = [a.sort, b.sort].sort
a1, a2 = a
b1, b2 = b
if a2 > b2
{range1: [[a1, b1], [b2, a2]], both: [[b1, b2]], range2: []}
elsif a2 >= b1
{range1: [[a1, b1]], both: [[b1, a2]], range2: [[a2, b2]]}
else
{range1: [[a1, a2]], both: [], range2: [[b1, b2]]}
end
end
根据您使用两者的方式,nil
作为值可能并不理想;使用任何表示没有共同范围的东西。
答案 1 :(得分:1)
def intersection((x1, x2), (x3, x4))
h = {}
e1, e2 = x1..x2, x3..x4
[x1, x2, x3, x4].sort.each_cons(2) do |x5, x6|
key =
case [e1, e2].select{|e| e.include?(x5..x6)}
when [e1] then :range1
when [e2] then :range2
when [e1, e2] then :both
end
h[key] ||= []
h[key].push([x5, x6])
end
h
end