ruby组范围彼此接近

时间:2014-05-12 09:45:25

标签: ruby range

我有这些范围:

X = [10..17,21..34,40..117,384..399,407..455,989..1013]

我需要的是: 如果第二个范围的第一个数减去第一个范围的最后一个数小于10,则将它们组合在一起,否则包括范围。 我需要的是以下内容:

result = [[10..17,21..34,40..117],[384..399,407..455],[989..1013]]

我所做的就是这个,但这并不是两个以上的组合。

Y = []
X.each_cons(2) do |r1,r2|
  if (r2.first - r1.last) < 10
      Y << ((r1.last - r1.first) + (r2.last - r2.first)
  else
      Y << (r1.last - r1.first)
  end
end

# Y = [[10..17,21..34,40..117],[384..399,407..455],[989..1013]]

我还想在每个元素中添加所有范围:

Y = [97, 63, 24]

任何帮助将不胜感激。提前谢谢。

1 个答案:

答案 0 :(得分:2)

prev = X.first.last
# => 17
X.slice_before{|r| (r.first - prev >= 10).tap{prev = r.last}}.to_a
# => [[10..17, 21..34, 40..117], [384..399, 407..455], [989..1013]]