[RUBY] Studieren bei CodeWar (Rubin) ③ Squeeze, gsub

Über diesen Artikel

Nach und nach wird das ausgegeben, was ich durch den kürzlich gestarteten Codewar gelernt habe

Problem

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.

Sequenz als Argument mit der Funktion unique_in_order? Wird empfangen und der gleiche Wert ist nicht benachbart, und die Liste wird in der Reihenfolge der Elemente zurückgegeben.

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]

So wie ich dachte

(1) Ich habe versucht, den wiederholt verwendeten Wert zu löschen, und nachdem ich das empfangene Argument in ein Array konvertiert hatte, habe ich versucht, es "uniq" zu machen, aber es ist fehlgeschlagen, weil es wie folgt wurde.


def unique_in_order(iterable)
  iterable.chars.uniq
end

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

(2) Als ich nach aufeinanderfolgenden Werten suchte, fand ich die "Squeeze-Methode". https://docs.ruby-lang.org/ja/latest/method/String/i/squeeze.html

squeeze(*chars) -> String[permalink][rdoc][edit] Wenn mehrere in Zeichen enthaltene Zeichen in einer Reihe stehen, kombinieren Sie sie zu einem Zeichen.

def unique_in_order(iterable)
  iterable.squeeze.chars
end

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

Es ist fertig! !! !! !!

Aber es ist noch nicht vorbei

Als ich es einreichte, war ich über drei Dinge wütend: ❤️

① <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>

Allen gemeinsam ist, dass Sie "suqueeze" nicht für Arrays verwenden können.

Mit anderen Worten

Sollten wir nicht einfach "iterable.squeeze.chars" ausführen, wenn das Argument eine Zeichenfolge ist, und "iterable.uniq", wenn es sich um ein Array handelt?

Ich hatte Erfolg! !! !!

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

Ideale Antwort

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

Oh, warte eine Minute. Ich verstehe nicht (lacht)

gsub Methode

gsub(pattern, replace) -> String Erzeugt und gibt eine Zeichenfolge zurück, in der alle Teile der Zeichenfolge, die dem Muster entsprechen, durch Zeichenfolgen ersetzen ersetzt werden.

#Wenn Sie keine regulären Ausdrücke verwenden
#String.gsub(置換したいString, 置換後のString)

#Bei Verwendung von regulären Ausdrücken
#String.gsub(/Reguläre Ausdrücke/, Reguläre Ausdrückeに該当した箇所を置換した後のString)

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"

Machst du es mit regulären Ausdrücken? Ich werde dies vor dem Update noch etwas genauer untersuchen!

Recommended Posts

Studieren bei CodeWar (Rubin) ③ Squeeze, gsub
Studieren bei CodeWar (Rubin) ②
Studieren bei CodeWar (Rubin) ⑥ injizieren
Studieren bei CodeWar
Studieren bei CodeWar (Rubin) ⑤ proc
Studieren bei CodeWar (Ruby) ④ case ~ when