-2

我想在 Ruby 中找到两点的交集。应该进行什么类型的检查,以便该功能适用​​于所有情况。

伪代码是

交点(范围 1,范围 2)

  • notCommonR1 = range1 中不常见的部分

  • 共同 = 两个范围之间的共同部分

  • notCommonR2 = range2 中不常见的部分

例如

intersection([0, 3], [2, 4]) == {
:range1 => [[0, 2]],
:both => [2, 3],
:range2 => [[3, 4]]
}
4

2 回答 2

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
于 2013-05-02T18:27:04.533 回答
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因为值可能并不理想;使用任何表明没有共同范围的东西。

于 2013-05-02T18:10:49.293 回答