Ruby任务:将数字连接成区间

9

我有一个唯一数字的数组,像这样:[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

但我认为这里可能有更简洁的解决方案。

我需要将多年份拼接在一起。我有多个年份,想要以这种方式压缩它们。例如:Pedro Yanoviches (1985-1994, 1999-2010) - fl00r
可能是索引数组转范围数组的重复问题。 - Wayne Conrad
非常接近的主题,但有一点不同。无论如何,这也是有帮助的。谢谢。 - fl00r
1
这个解决方案很棒 https://dev59.com/Bm865IYBdhLWcg3wnP6a#3729459 - fl00r
3个回答

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

输出

$ ruby test.rb
1-4
7-8
10
12

输出不够符合我的需求。我们需要再进行一步操作才能得到这个结果:"1-4,7-8,10,12"。 - fl00r
谢谢 each_cons 方法 :) 这对我来说是新的 - fl00r
好的,输出格式由您自行决定。请查看我的编辑。 - ghostdog74
1
@fl00r:torange([1,2,3,4,7,8,10,12]).map{|x| x[0] == x[1] ? x[0] : x.join('-') }.join(', ') - Mike Woodhouse

1

这是我的一行代码:

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]

还有一点点的猴子补丁

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]

0
这个函数是递归的,虽然感觉有点可以改进...
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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接