Petit à petit, sortie de ce que j'ai appris grâce au Codewar récemment lancé
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]
(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! !! !! !!
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.
Ne devrions-nous pas faire ʻiterable.squeeze.chars si l'argument est une chaîne et ʻiterable.uniq
si l'argument est un tableau?
def unique_in_order(iterable)
if iterable.class == String
iterable.squeeze.chars
else
iterable.uniq
end
end
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)
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!