Поиск диапазонов перекрытия в хешах Ruby - PullRequest
1 голос
/ 22 декабря 2010

Скажем, у вас есть следующий хеш Ruby,

hash = {:a => [[1, 100..300],
               [2, 200..300]],
        :b => [[1, 100..300], 
               [2, 301..400]]
       }

и следующие функции,

def overlaps?(range, range2)
  range.include?(range2.begin) || range2.include?(range.begin)
end

def any_overlaps?(ranges)
  # This calls to_proc on the symbol object; it's syntactically equivalent to 
  # ranges.sort_by {|r| r.begin} 
  ranges.sort_by(&:begin).each_cons(2).any? do |r1, r2|
    overlaps?(r1, r2)
  end
end

, и вы хотите, для каждой клавиши в hash, проверить,любой диапазон перекрывается с любым другим.В hash выше я бы ожидал, что hash[:a] разозлит меня, а hash[:b] - нет.

Как это лучше всего реализовать синтаксически?

Ответы [ 2 ]

1 голос
/ 22 декабря 2010
hash.each{|k, v| puts "#{k} #{any_overlaps?( v.map( &:last )) ? 'overlaps' : 'is ok'}."}

вывод:

a overlaps.
b is ok.
0 голосов
/ 30 января 2014

Вот еще один способ написать any_overlaps:

def any_overlaps?(ranges)
  (a = ranges.map { |r| [r.first, r.last] }.sort_by(&:first).flatten) != a.sort 
end

any_overlaps? [(51..60),(11..20),(18..30),(0..10),(31..40)] # => true
any_overlaps? [(51..60),(11..20),(21..30),(0..10),(31..40)] # => false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...