Ruby任务:将数字连接到间隔

fl0*_*00r 9 ruby

我有一系列uniq号码.像这样:[1,2,3,4,7,8,10,12].它可以是未分类的.我需要的是获得这个数组的间隔:

intervals_for [1,2,3,4,7,8,10,12]
#=> "1-4, 7-8, 10,12"
Run Code Online (Sandbox Code Playgroud)

我有自己的解决方案:

def intervals_for(array)
  array.sort!
  new_array = []
  array.each do |a|
    if new_array.last and a == new_array.last.last+1
      new_array.last << a
    else
      new_array << [a]    
    end
  end
  new_array.map{|a| a.size > 1 ? "#{a.first}-#{a.last}" : a.first}.join(", ")
end
Run Code Online (Sandbox Code Playgroud)

但我认为这里的某个地方更清洁

gho*_*g74 2

这是我的,使用版本 1.9.1

def torange(a)
  r=[];s=a[0]
  a.uniq.sort!.each_cons(2) do |a|
      r<<[s,a[0]] and s=a[1] if a[1]-a[0]!=1
  end
  left=a.index(s)
  r<<[a[left..-1][0],a[left..-1][-1]]
end

torange([1,2,3,4,7,8,10,12]).each do |x|
  puts x[0]==x[1] ? "#{x[0]}" : "#{x[0]}-#{x[1]}"
end
Run Code Online (Sandbox Code Playgroud)

输出

$ ruby test.rb
1-4
7-8
10
12
Run Code Online (Sandbox Code Playgroud)