Besserer Weg, um ein Programm mit ausgeglichenen Klammern in Ruby zu schreiben

Diese Methode soll eine Zeichenfolge nehmen und feststellen, ob die Klammern '(' '{' ['in der Zeichenfolge ordnungsgemäß mit den entsprechenden (gegenüberliegenden) Klammern geschlossen werden.

Erstens gibt es eine elegantere, kompaktere Möglichkeit, dieses Bit zu schreiben, ohne alle "oder" (||) zu verwenden:

            split_array.each do |i| 
              if (i == "{" || i == "(" || i == "[")
                  left.push(i)
                else (i == "}" || i == ")" || i == "]")
                  right.push(i)
                end
             end

Meine zweite Frage ist, ist dieser Code schrecklich (siehe unten)? Es scheint, dass ich dies in weniger Zeilen schreiben könnte, aber logischerweise habe ich (noch) keine andere Lösung gefunden. Der Code funktioniert für die meisten Tests, gibt aber für diesen Test false zurück (siehe alle Treibertests unter unten): p valid_string? ("[(text) {}]") == true

Jede Kritik wäre sehr dankbar! (Auch wenn es einen besseren Abschnitt gibt, um dies zu posten, lass es mich bitte wissen.) Danke!

def valid_string?(string)

    opposites = { "[" => "]", "{" => "}", "(" => ")", "]" => "[", "}" => "{", ")" => "(" }

        left = Array.new
        right = Array.new
        return_val = true

        split_array = string.split(//)
        split_array.delete_if { |e| e.match(/\s/) }

          split_array.each do |i| 
          if (i == "{" || i == "(" || i == "[")
              left.push(i)
            else (i == "}" || i == ")" || i == "]")
              right.push(i)
            end
          end

        # p left
        # p right

        left.each_index do |i|
          if left[i] != opposites[right[i]]
              return_val = false
          end
        end  
        return_val
    end 

    p valid_string?("[ ] } ]") == false
    p valid_string?("[ ]") == true
    p valid_string?("[  ") == false                 
    p valid_string?("[ ( text ) ,{} ]") == true    
    p valid_string?("[ ( text { ) } ]") == false  
    p valid_string?("[ (] {}") == false 
    p valid_string?("[ ( ) ") == false

-------Aktualisiert: Nachdem ich verschiedene Ansätze ausprobiert habe, lautet mein Refactor wie folgt:-----------

def valid_string?(str)

    mirrored = { "[" => "]", "{" => "}", "(" => ")" }
    open_brackets = Array.new

    split_str_array = str.split("")

    split_str_array.each do |bracket| 
      if bracket.match(/[\[|\{|\(]/) then open_brackets.push(bracket)
      elsif bracket.match(/[\]|\}|\)]/)
        return false if mirrored[open_brackets.pop] != bracket
      end
    end
    open_brackets.empty?
end 

Antworten auf die Frage(6)

Ihre Antwort auf die Frage