Les gammes de rubis sont assez cool.
Je me retrouve avec des tableaux tels que ceci: et doit ensuite supprimer des morceaux d'entre eux. Pour cela, je: p> Ils sont manipulés, certains chiffres sont exclus et d'autres peuvent être ajoutés. Je peux me retrouver avec ceci: p> 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: p> merci! P> p>
7 Réponses :
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: P>
(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]
+1 Belle solution, mais la valeur de l'emploi devrait être couvre [0 ..- 2] + [spans.last.first..n] code> (é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.
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)
solution fonctionnelle et non lisible: et une belle: p>
SpaceBeforemodifierKeyKeword de Rubocopt a détecté qu'il n'y avait pas d'espace avant si code> dans
a.push ([]) si le rendement (i, j) code>. Je ne savais pas que c'était valide Ruby. O_o
Rubocop suggère également d'utiliser chacun_with_object code> plutôt que
injecter code>.
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 et les résultats de l'exécution de ce sont p>
C'est très cool. Imaginez essayer de le faire dans une langue qui n'a pas fait de datation-dactylographie.
Voici une réponse (adaptée de Ce code ) qui est plus de deux fois plus rapide que L'autre code posté ici. En outre, seule cette réponse et Celui de @steve A > Poignez des matrices de non-entiers. user system total real
steve 1.107000 0.000000 1.107000 ( 1.106221)
wayne 1.092000 0.000000 1.092000 ( 1.099220)
user229426 0.531000 0.000000 0.531000 ( 0.523104)
mladen1 0.780000 0.000000 0.780000 ( 0.774154)
mladen2 0.780000 0.000000 0.780000 ( 0.792159)
phrogz 0.218000 0.000000 0.218000 ( 0.220044)
array.sort!.uniq!
~~ Vous ne pouvez pas chaîner la chaîne trier! Code> !!!! ~~ désolé réellement
trier! Code> 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
! Code> 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
! Code>
@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 :)
Plus de solutions sur: Stackoverflow.com/questions/12360108
(234..25) code> est une plage non valide.
(234..25) .Oa_a => [] code>.