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