From aaa7386df6f2093edf853267a2b2ce633f96bd42 Mon Sep 17 00:00:00 2001 From: Jeff Casimir Date: Fri, 3 Feb 2017 11:08:48 -0700 Subject: [PATCH 1/6] Setup files --- string_validator.rb | 3 +++ string_validator_test.rb | 8 ++++++++ 2 files changed, 11 insertions(+) create mode 100644 string_validator.rb create mode 100644 string_validator_test.rb diff --git a/string_validator.rb b/string_validator.rb new file mode 100644 index 0000000..153ef84 --- /dev/null +++ b/string_validator.rb @@ -0,0 +1,3 @@ +class StringValidator + +end diff --git a/string_validator_test.rb b/string_validator_test.rb new file mode 100644 index 0000000..09908c0 --- /dev/null +++ b/string_validator_test.rb @@ -0,0 +1,8 @@ +require 'minitest/autorun' +require './string_validator' + +class StringValidatorTest < Minitest::Test + def test_it_exists + assert StringValidator + end +end From 24f51f6cd08905f0fccb4bdb849d8f424be83258 Mon Sep 17 00:00:00 2001 From: Jeff Casimir Date: Fri, 3 Feb 2017 11:14:26 -0700 Subject: [PATCH 2/6] Validates empty string and single parens --- string_validator.rb | 14 +++++++++++++- string_validator_test.rb | 16 ++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/string_validator.rb b/string_validator.rb index 153ef84..0ec9229 100644 --- a/string_validator.rb +++ b/string_validator.rb @@ -1,3 +1,15 @@ class StringValidator - + def validate(target) + # consider just "()" and ")(" + if target.length > 0 + tokens = target.chars + if tokens[0] == "(" && tokens[1] == ")" + true + else + false + end + else + true + end + end end diff --git a/string_validator_test.rb b/string_validator_test.rb index 09908c0..b3f5cb7 100644 --- a/string_validator_test.rb +++ b/string_validator_test.rb @@ -5,4 +5,20 @@ class StringValidatorTest < Minitest::Test def test_it_exists assert StringValidator end + + def test_an_empty_string_is_valid + sv = StringValidator.new + assert sv.validate("") + end + + def test_single_parens_are_valid + sv = StringValidator.new + assert sv.validate("()") + end + + def test_single_inverted_parens_are_not_valid + sv = StringValidator.new + refute sv.validate(")(") + end + end From 39deb7e405119bb71bd2013a6566f06011b0f878 Mon Sep 17 00:00:00 2001 From: Jeff Casimir Date: Fri, 3 Feb 2017 11:19:48 -0700 Subject: [PATCH 3/6] Validate each kind of bracket --- string_validator.rb | 10 +++++++++- string_validator_test.rb | 9 +++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/string_validator.rb b/string_validator.rb index 0ec9229..89a3d58 100644 --- a/string_validator.rb +++ b/string_validator.rb @@ -1,9 +1,17 @@ class StringValidator + def pairings + { + "(" => ")", + "[" => "]", + "{" => "}", + } + end + def validate(target) # consider just "()" and ")(" if target.length > 0 tokens = target.chars - if tokens[0] == "(" && tokens[1] == ")" + if pairings[tokens[0]] == tokens[1] true else false diff --git a/string_validator_test.rb b/string_validator_test.rb index b3f5cb7..17bd9ad 100644 --- a/string_validator_test.rb +++ b/string_validator_test.rb @@ -21,4 +21,13 @@ def test_single_inverted_parens_are_not_valid refute sv.validate(")(") end + def test_single_square_brackets_are_valid + sv = StringValidator.new + assert sv.validate("[]") + end + + def test_single_curly_brackets_are_valid + sv = StringValidator.new + assert sv.validate("{}") + end end From 9f379d6cd248d235930ed0339bf0b62966ca4db4 Mon Sep 17 00:00:00 2001 From: Jeff Casimir Date: Fri, 3 Feb 2017 11:22:02 -0700 Subject: [PATCH 4/6] Refactor how pairings are checked --- string_validator.rb | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/string_validator.rb b/string_validator.rb index 89a3d58..fd68fef 100644 --- a/string_validator.rb +++ b/string_validator.rb @@ -7,17 +7,13 @@ def pairings } end + def matched_pair?(t1, t2) + pairings[t1] == t2 + end + def validate(target) - # consider just "()" and ")(" - if target.length > 0 - tokens = target.chars - if pairings[tokens[0]] == tokens[1] - true - else - false - end - else - true - end + true if target.empty? + tokens = target.chars + matched_pair?(tokens[0], tokens[1]) end end From ca9f4d7e5adbc7b4a2173934487229d80a111c87 Mon Sep 17 00:00:00 2001 From: Jeff Casimir Date: Fri, 3 Feb 2017 11:46:35 -0700 Subject: [PATCH 5/6] Implemented stack-based multi-pair verification --- string_validator.rb | 31 ++++++++++++++++++++++++++++--- string_validator_test.rb | 31 +++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/string_validator.rb b/string_validator.rb index fd68fef..992a144 100644 --- a/string_validator.rb +++ b/string_validator.rb @@ -1,4 +1,10 @@ class StringValidator + attr_reader :token_stack + + def initialize + @token_stack = [] + end + def pairings { "(" => ")", @@ -11,9 +17,28 @@ def matched_pair?(t1, t2) pairings[t1] == t2 end + def left?(token) + pairings.keys.include?(token) + end + + def right?(token) + pairings.values.include?(token) + end + def validate(target) - true if target.empty? - tokens = target.chars - matched_pair?(tokens[0], tokens[1]) + answer = pairs_match?(target) && token_stack.empty? + token_stack.clear + return answer + end + + def pairs_match?(input) + input.chars.all? do |token| + if left?(token) + token_stack.push(token) + elsif right?(token) + left = token_stack.pop + matched_pair?(left, token) + end + end end end diff --git a/string_validator_test.rb b/string_validator_test.rb index 17bd9ad..23f8933 100644 --- a/string_validator_test.rb +++ b/string_validator_test.rb @@ -30,4 +30,35 @@ def test_single_curly_brackets_are_valid sv = StringValidator.new assert sv.validate("{}") end + + def test_two_pairs_of_matched_brackets_are_valid + sv = StringValidator.new + assert sv.validate("{}()") + end + + def test_mismatched_second_brackets_are_invalid + sv = StringValidator.new + refute sv.validate("{})(") + end + + def test_complex_nesting_is_valid + sv = StringValidator.new + assert sv.validate("([{}[]])") + end + + def test_complex_nesting_with_some_trash_is_invalid + sv = StringValidator.new + refute sv.validate("([{}[]])]") + end + + def test_complex_nesting_with_some_other_trash_is_invalid + sv = StringValidator.new + refute sv.validate("([{}[]])[") + end + + def test_validating_a_second_input_works_correctly + sv = StringValidator.new + refute sv.validate("([{}[]])[") + assert sv.validate("()") + end end From 452b6cfe702625f127e301afc96233801bb3f296 Mon Sep 17 00:00:00 2001 From: Jeff Casimir Date: Fri, 3 Feb 2017 11:50:37 -0700 Subject: [PATCH 6/6] Renaming variable to have another commit --- string_validator.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/string_validator.rb b/string_validator.rb index 992a144..f6b5d04 100644 --- a/string_validator.rb +++ b/string_validator.rb @@ -31,8 +31,8 @@ def validate(target) return answer end - def pairs_match?(input) - input.chars.all? do |token| + def pairs_match?(target) + target.chars.all? do |token| if left?(token) token_stack.push(token) elsif right?(token)