相互靠近的ruby组范围

相互靠近的ruby组范围,ruby,range,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

我有以下范围:

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]我不知道你的意思(加起来得到它)。Y=[10..17,21..34,40..117],[384..399407..455],[989..1013],[7+13+77],[15+48],[24]=>[97,63,24]
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]]
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]]