代码之家  ›  专栏  ›  技术社区  ›  fl00r

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

  •  9
  • fl00r  · 技术社区  · 14 年前

    我有一组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
    

    但我认为这里的某个地方更干净

    3 回复  |  直到 13 年前
        1
  •  2
  •   ghostdog74    14 年前

    这是我的,使用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
    
        2
  •  1
  •   fl00r    13 年前

    这是我的一句话:

    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]
    
        3
  •  0
  •   Ben Marini    14 年前

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

    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)