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

Ruby任务:将数字连接到间隔,ruby,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" 我有自己的解决方案: def intervals_for(array) array.sort! new_array = [] array.each do |a| if new_array.last and a == new_array.l

我有一个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"
我有自己的解决方案:

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
def interval_(阵列)
数组,排序!
新的_数组=[]
array.each do | a|
如果new_array.last和a==new_array.last.last+1

新的_array.last这是我的,使用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

这一个是递归的,感觉可能会更好

arr =  [1,2,3,4,7,8,10,12]

def intervals(arr)
  return arr if arr.size == 0 || arr.size == 1

  int = [arr.shift]
  while int.last + 1 == arr.first
    int << arr.shift
  end

  ( int.size == 1 ? int : ["#{int.first}-#{int.last}"] ) + intervals(arr)
end

p intervals(arr)
arr=[1,2,3,4,7,8,10,12]
def间隔(arr)
如果arr.size==0 | | arr.size==1,则返回arr
int=[arr.shift]
而int.last+1==arr.first
int这是我的一行:

array = [-10, -9, -1, 0, 1, 2, 3, 4, 10, 11, 15, 133]
array.uniq.sort.inject([]){ |a, e| a[-1] && a[-1].last && a[-1].last == e-1 ? a[-1] = (a[-1].first..e) : a << (e..e); a }
#=> [-10..-9, -1..4, 10..11, 15..15, 133..133]
array=[-10,-9,-1,0,1,2,3,4,10,11,15,133]
array.uniq.sort.injection([]){a,e | a[-1]&&a[-1]。last&&a[-1]。last==e-1?a[-1]=(a[-1]。first..e):a[-10..-9,-1..4,10..11,15..15,133..133]
还有小猴子

class Array
  def.collect_to_ranges
    self.uniq.sort.inject([]){ |a, e| a[-1] && a[-1].last && a[-1].last == e-1 ? a[-1] = (a[-1].first..e) : a << (e..e); a }
  end
end

array = [1,2,3,4,5,6,7,8, 10]
array.collect_to_ranges
#=> [1..8, 10..10]
类数组
def.collect_至_范围
self.uniq.sort.injection([]){a,e | a[-1]&&a[-1]。last&&a[-1]。last==e-1?a[-1]=(a[-1]。first..e):a[1..8,10..10]

我需要它来连接年份。我有很多年份,我想用这种方式压缩它们。比如:
Pedro Yanoviches(1985-1994,1999-2010)
可能与非常接近的主题重复,但有点不同。无论如何,这也很有帮助。谢谢。这个解决方案很好,输出没有我需要的那么人性化。我们需要更多的步骤来实现这一点:
“1-4,7-8,10,12”
Thanx for
each_cons
method:)这对我来说是新的,输出取决于您根据自己的意愿进行格式化。请参阅我的编辑。@fl00r:torange([1,2,3,4,7,8,10,12])。map{x | x[0]==x[1]?x[0]:x.join('-')}.join('-')join(','))
class Array
  def.collect_to_ranges
    self.uniq.sort.inject([]){ |a, e| a[-1] && a[-1].last && a[-1].last == e-1 ? a[-1] = (a[-1].first..e) : a << (e..e); a }
  end
end

array = [1,2,3,4,5,6,7,8, 10]
array.collect_to_ranges
#=> [1..8, 10..10]