9
votes

Tâche Ruby: Rejoindre des chiffres à des intervalles

J'ai un tableau de nombres UNIQ. Comme ceci: [1,2,3,4,7,8,10,12]. Cela peut être non traduit. Ce dont j'ai besoin, c'est d'obtenir des INTEvals pour ce tableau:

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


4 commentaires

J'en ai besoin pour rejoindre des années ensemble. J'ai du nombre d'années et je veux les compacter de cette façon. Comme: Pedro Yanoviches (1985-1994, 1999-2010)


Dupliqué possible de Array d'index à la matrice de gammes


Thème très proche mais un peu différent. En tout cas, c'est utile aussi. Merci


Cette solution est excellente Stackoverflow.com/questions/3728660/...


3 Réponses :


2
votes

Voici le mien, à l'aide de Ver 1.9.1 xxx

sortie xxx


4 commentaires

La sortie n'est pas si humaine que nécessaire. Nous avons besoin d'une étape de plus pour obtenir cela ici: "1-4, 7-8, 10, 12"


Merci pour chaque_cons méthode :) c'est nouveau pour moi


Eh bien, la sortie est à vous de le formater en fonction de votre souhait. Voir mon édition.


@ FL00R: Torange ([1,2,3,4,7,8,10,12]). Carte {| x | x [0] == x [1]? x [0]: x.join ('-')} .join (',')



0
votes

Celui-ci est récursif, on se sent comme si cela pourrait être mieux cependant ...

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)


0 commentaires

1
votes

Voici mon one-liner:

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 commentaires