2013-05-02 4 views
-2

Я хочу найти пересечение двух точек в Ruby. Какие типы проверок должны быть там, чтобы функция работала для всех случаев.Пересечение двух точек в Ruby

Псевдокод код

пересечения (диапазон1, диапазон2)

  • notCommonR1 = часть range1, которая не является общим

  • общая = общая часть между обоими диапазонов

  • notCommonR2 = часть диапазона2, которая не является общей.

Например

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

для меня непонятно. 'часть диапазона1, которая не является обычным', с какой? –

+0

Подобно Range1 - линия от 1 --- 4, а Range2 - линия 3 --- 4 1 --- 3 является частью диапазона1, который не является частью диапазона2. – wali

+0

': range1 => [[0, 2]]' и ': range2 => [[3, 4]]' как это происходит? –

ответ

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 как значение не может быть идеальным; используйте то, что указывает на отсутствие общего диапазона.

+0

Что делать, если между четырьмя переменными есть одинаковые значения? – sawa

+0

-1. Когда вы делаете 'пересечение ([0, 4], [2, 3])' с кодом, он возвращает '{ : range1 => [ 0, ], : и => [ 2, ], : диапазон2 => [ 4, ] } '. – sawa

+0

Кажется, я поспешил сказать, что других особых случаев не было. Мои извинения, я обновил свой код, чтобы он работал. (Теперь я также понимаю, почему вы хотите, чтобы диапазоны были инкапсулированы в списки). Если переменные одинаковы, они будут использовать диапазоны, такие как [1, 1]. Конечно, это не имеет смысла, если диапазоны считаются исключительными, и в этом случае потребуется немного дополнительного кода для его фильтрации. – azgult

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 
Смежные вопросы