10
votes

Tableau d'index à la matrice de gammes

Les gammes de rubis sont assez cool. Je me retrouve avec des tableaux tels que ceci: xxx

et doit ensuite supprimer des morceaux d'entre eux. Pour cela, je: xxx

Ils sont manipulés, certains chiffres sont exclus et d'autres peuvent être ajoutés. Je peux me retrouver avec ceci: xxx

Comment puis-je convertir cela dans un réseau compact de gammes? Il semble que la fonction inverse devrait exister? Je m'attendrais à ce qu'il retourne quelque chose comme ceci: xxx

merci!


2 commentaires

Plus de solutions sur: Stackoverflow.com/questions/12360108


(234..25) est une plage non valide. (234..25) .Oa_a => [] .


7 Réponses :


1
votes

Je n'ai jamais rien vu dans la langue rubis qui fait cela, mais voici un certain code qui pourrait vous aider à le faire vous-même:

http://snippets.dzone.com/posts/show/4677


0 commentaires

14
votes

(nouveau et amélioré. Reste frais dans votre réfrigérateur pendant deux semaines jusqu'à deux semaines!):

a = [1, 2, 3, 10, 11, 20, 20, 4]

ranges = a.sort.uniq.inject([]) do |spans, n|
  if spans.empty? || spans.last.last != n - 1
    spans + [n..n]
  else
    spans[0..-2] + [spans.last.first..n]
  end
end

p ranges    # [1..4, 10..11, 20..20]


4 commentaires

+1 Belle solution, mais la valeur de l'emploi devrait être couvre [0 ..- 2] + [spans.last.first..n] (édité à la solution)


@Steve Weet, merci. Bonne prise.


Excellent, merci! Vérifiez également la généralisation de Steve Weet et la réponse de Mladen Jablanović plus loin!


Tout le monde dans cet endroit est plus intelligent que moi et @mladen Jablanović les frappe systématiquement du parc.



1
votes
ar=[505, 506, 507, 600, 1647, 1648, 1649, 1650, 1651, 1654]
def to_range(a)
  s=a[0]
  a.each_cons(2) do |a|
    if a[1]-a[0]!=1
        p s .. a[0]
        s=a[1]
    end
  end
  left=a.index(s)
  p a[left..-1][0]..a[left..-1][-1]
end
to_range(ar)

0 commentaires

8
votes

solution fonctionnelle et non lisible: xxx

et une belle: xxx


2 commentaires

SpaceBeforemodifierKeyKeword de Rubocopt a détecté qu'il n'y avait pas d'espace avant si dans a.push ([]) si le rendement (i, j) . Je ne savais pas que c'était valide Ruby. O_o


Rubocop suggère également d'utiliser chacun_with_object plutôt que injecter .



5
votes

Il s'agit d'un algorithme de berceau droit de Wayne Conrads avec un petit tweak pour le faire fonctionner pour d'autres types de gammes, par ex. alphabétique xxx

et les résultats de l'exécution de ce sont xxx


1 commentaires

C'est très cool. Imaginez essayer de le faire dans une langue qui n'a pas fait de datation-dactylographie.




0
votes
array.sort!.uniq!

3 commentaires

~~ Vous ne pouvez pas chaîner la chaîne trier! !!!! ~~ désolé réellement trier! est-il à la charge d'une chaîne sûre pour une raison quelconque. La plupart des autres méthodes de mutation se terminant par ! ne sont pas (comme gsub !, uniq !, etc.), donc je vois juste quand je vois quelqu'un en utilisant la valeur de retour de toute méthode se terminant par !


@Jackcasey, bien sûr, vous pouvez chaîner une des méthodes énumérées (triez !, gsub! UNIQ!). Mais cela pourrait avoir de sens dans certains cas


Bien sûr, je voulais dire que c'est un piège parfois :)