Étudier à CodeWar (ruby) ③ squeeze, gsub

À propos de cet article

Petit à petit, sortie de ce que j'ai appris grâce au Codewar récemment lancé

problème

Implement the function unique_in_order which takes as argument a sequence and returns a list of items without any elements with the same value next to each other and preserving the original order of elements.

Séquence comme argument en utilisant la fonction unique_in_order? Est reçu, et la même valeur n'est pas adjacente, et la liste est renvoyée dans l'ordre des éléments.

unique_in_order('AAAABBBCCDAABBB') == ['A', 'B', 'C', 'D', 'A', 'B']
unique_in_order('ABBCcAD')         == ['A', 'B', 'C', 'c', 'A', 'D']
unique_in_order([1,2,2,3,3])       == [1,2,3]

La façon dont je pensais

(1) J'ai essayé d'effacer la valeur qui a été utilisée à plusieurs reprises, et après avoir converti l'argument reçu en un tableau, j'ai essayé de le rendre ʻuniq`, mais cela a échoué car il est devenu comme suit.


def unique_in_order(iterable)
  iterable.chars.uniq
end

unique_in_order('AAAABBBCCDAABBB')
=>["A", "B", "C", "D"]

(2) Lorsque j'ai recherché des valeurs consécutives, j'ai découvert la «méthode squeeze». https://docs.ruby-lang.org/ja/latest/method/String/i/squeeze.html

squeeze(*chars) -> String[permalink][rdoc][edit] Si plusieurs caractères contenus dans des caractères sont alignés, combinez-les en un seul caractère.

def unique_in_order(iterable)
  iterable.squeeze.chars
end

unique_in_order('AAAABBBCCDAABBB')
=>["A", "B", "C", "D", "A", "B"]

C'est fait! !! !! !!

Mais ce n'est pas encore fini

Quand je l'ai soumis, j'étais en colère contre trois choses comme suit ❤️

① <NoMethodError: undefined method `squeeze' for []:Array>
② <NoMethodError: undefined method `squeeze' for [1, 2, 3, 3]:Array>
③ <NoMethodError: undefined method `squeeze' for ["a", "b", "b"]:Array>

Ce qu'ils ont tous en commun, c'est que vous ne pouvez pas utiliser «suqueeze» sur les tableaux.

En d'autres termes

Ne devrions-nous pas faire ʻiterable.squeeze.chars si l'argument est une chaîne et ʻiterable.uniq si l'argument est un tableau?

J'ai réussi! !! !!

def unique_in_order(iterable)
  if iterable.class == String
    iterable.squeeze.chars
  else
    iterable.uniq
  end
end

Réponse idéale

def unique_in_order(iterable)
  case iterable
    when String
      iterable.gsub(/(.)\1*/, '\1').split('')
    when Array
      iterable.uniq
  end
end

Oh attendez une minute. Je ne comprends pas (rires)

méthode gsub

gsub(pattern, replace) -> String Génère et retourne une chaîne dans laquelle toutes les parties de la chaîne qui correspondent au modèle sont remplacées par string replace.

#Si vous n'utilisez pas d'expressions régulières
#Chaîne.gsub(置換したいChaîne, 置換後のChaîne)

#Lors de l'utilisation d'expressions régulières
#Chaîne.gsub(/Expressions régulières/, Expressions régulièresに該当した箇所を置換した後のChaîne)

p 'abcdefg'.gsub(/def/, '!!')          # => "abc!!g"
p 'abcabc'.gsub(/b/, '<<\&>>')         # => "a<<b>>ca<<b>>c"
p 'xxbbxbb'.gsub(/x+(b+)/, 'X<<\1>>')  # => "X<<bb>>X<<bb>>"
p '2.5'.gsub('.', ',') # => "2,5"

Le faites-vous en utilisant des expressions régulières? Je vais faire un peu plus de recherches à ce sujet avant de mettre à jour!

Recommended Posts

Étudier à CodeWar (ruby) ③ squeeze, gsub
Étudier à CodeWar (ruby) ②
Étudier à CodeWar (ruby) ⑥ inject
Étudier chez CodeWar
Étudier à CodeWar (ruby) ⑤ Proc
Étudier à CodeWar (ruby) ④ cas ~ quand