J'aimerais prendre des données telles que:
[[1,2],[4,7],[9,9],[13,13]]
5 Réponses :
Approche fonctionnelle utilisant Enumérable # Chunk a >: éléments) le tableau d'entrée. Enfin, nous devons simplement prendre le premier et le dernier élément de chaque groupe pour construire les paires. P> p>
Cela a l'air vraiment sympa. Totalement oublié de la nouvelle méthode du chunk.
Et de prendre une étape de plus, .map {| min, max | min == max? min: min .. max} code> aboutira:
[1..2, 4..7, 9, 13] code>.
Ou, changez [paires.first [0], pairs.last [0]] code> à
pairs.first [0] .. pairs.last [0] code> pour obtenir des gammes Dans toutes les positions:
[1..2, 4..7, 9,9, 13..13] code>.
Dans Ruby 2.4, le Enum_for code> sera Ne plus être nécessaire .
J'ai aussi posté une solution encore plus facile avec chunk_while code>
Une autre approche similaire à la méthode de Larsenal, mais en utilisant l'injection pour gérer les trucs ennuyeux. P> P>
hmm, eh bien, ce n'est pas Tokland chef-d'œuvre, mais je pense que c'est peut-être une bonne solution directe ... < Pré> xxx pré> p>
Ceci est presque juste à partir du Enumérable # SLICE_BONNA Méthode Documentation: ar = [1,2,4,5,6,7,9,13]
prev = ar[0]
ar.slice_before{|e|prev,prev2 = e,prev; prev2.succ != e}.map{|a|a.first..a.last}
#=> [1..2, 4..7, 9..9, 13..13]
une solution encore plus facile que @ Tokland's Thy Nice One utilise chunk_while code>
:
xs.chunk_while { |a, b| a + 1 == b }.map do |seq| [seq.first, seq.last] end
Demandez-vous s'il y a un code pour le faire déjà? Demandez-vous parce que vous essayez de rouler le vôtre et d'avoir du mal à la mettre en œuvre?
Je roule le mien. On dirait qu'il y a toujours des moyens intéressants de mettre en œuvre ce genre de chose à Ruby.
Par quelles conditions les gammes sont-elles censées être construites?
Une séquence entière continue dans le tableau doit composer une "plage" qui n'est vraiment qu'un tableau avec le début et la fin.
Dupliqué possible de Array d'index à la matrice de gammes