2013-10-25 4 views
0

У меня есть линия со следующими точками старта и остановки (0,3), то есть она также проходит через точки 1,2. У меня есть еще одна строка с точками старта и остановки (2,4), которая проходит через пункт 3. Используя Ruby, я пытаюсь найти набор точек, которые находятся в первой строке, а не во второй. В этом примере (0, 2) является желаемым выходом.Работа с диапазонами - ruby ​​

Я попытался создать диапазон (0..3), а затем преобразовал его в массив (0..3).to_a. Я также сделал то же самое со вторыми координатами линии, то есть (2..4).to_a.

Я пытался получить то, что содержится в одном массиве, который не находится в другом. Когда я вычитаю массивы, то есть (0..3).to_a - (2..4).to_a, я получаю [0,1]. Я хочу получить [0,2]. Любые идеи о том, как достичь этого?

+0

'(0..3) .to_a - (2..4) .to_a' -> '[0,1,2,3] - [2,3,4]' - каков должен быть результат? – user2864740

+0

Не могли бы вы немного подробнее рассказать о своем вопросе? 'Я пытался получить то, что содержится в одном массиве, который не находится в другом ..... Я хочу получить [0,2]'. Это немного запутанно? –

+0

Почему вы хотите получить '2' в результатах, когда вы исключили из диапазона' 2..4'? Если вы говорите о наборах, вы должны использовать этот метод. Если вы говорите об одномерных векторах, вы должны использовать другой подход. – tadman

ответ

1

Это вы что искали? (Если да, то проблема была выяснить вопрос, а не ответ.)

def doit(a, b) 
    a.to_a.reject {|e| e > b.first && e < b.last} 
end 

doit (0..3),(2..4) # => [0,1,2] 
doit (0..4),(2..4) # => [0,1,2,4] 
doit (0..3),(0..4) # => [0] 
doit (1..3),(0..4) # => [] 
doit (0..3),(-3..1) # => [1,2,3] 
doit (1..3),(2..2) # => [1,2,3] 
doit (1..4),(2..3) # => [1,2,3,4] 

или

def doit(a, b) 
    a = a.to_a 
    b.size < 3 ? a : a-(b.first+1..b.last-1).to_a 
end 
Смежные вопросы