ruby 的范围非常酷。
我最终得到这样的数组:

geneRanges = [(234..25), (500..510), (1640..1653)]

然后必须删除其中的一些位。为此,我:
genePositions = geneRanges.collect {|range| range.entries }.flatten
=> [500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653]

他们受到操纵,因此某些数字被排除在外,而其他数字可能会增加。我可能最终会这样:
[505, 506, 507, 600, 601, 602, 603, 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, 1654]

如何将其转换回紧凑的范围数组?似乎反函数应该存在?我希望它返回如下内容:
[(505..507), (600..603), (1643..1654)]

谢谢!

最佳答案

(新功能和改进功能。可以在冰箱中保鲜长达两个星期!):

a = [1, 2, 3, 10, 11, 20, 20, 4]

ranges = a.sort.uniq.inject([]) do |spans, n|
  if spans.empty? || spans.last.last != n - 1
    spans + [n..n]
  else
    spans[0..-2] + [spans.last.first..n]
  end
end

p ranges    # [1..4, 10..11, 20..20]

09-11 19:36