From 99da068bd1a6aa39bf06d47ea991d9d6dc4d8134 Mon Sep 17 00:00:00 2001 From: "exercism-solutions-syncer[bot]" <211797793+exercism-solutions-syncer[bot]@users.noreply.github.com> Date: Mon, 1 Sep 2025 00:23:57 +0000 Subject: [PATCH 01/11] [Sync Iteration] python/matching-brackets/1 --- solutions/python/matching-brackets/1/matching_brackets.py | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 solutions/python/matching-brackets/1/matching_brackets.py diff --git a/solutions/python/matching-brackets/1/matching_brackets.py b/solutions/python/matching-brackets/1/matching_brackets.py new file mode 100644 index 0000000..c8e8f56 --- /dev/null +++ b/solutions/python/matching-brackets/1/matching_brackets.py @@ -0,0 +1,2 @@ +def is_paired(input_string): + pass From afb4d12b117557fe189a1aa6d7f339beb6f43c11 Mon Sep 17 00:00:00 2001 From: Egor Kostan Date: Sun, 31 Aug 2025 17:29:09 -0700 Subject: [PATCH 02/11] First test --- matching-brackets/matching_brackets.py | 28 ++++++++++++++++++++- matching-brackets/matching_brackets_test.py | 2 ++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/matching-brackets/matching_brackets.py b/matching-brackets/matching_brackets.py index c8e8f56..ff5706e 100644 --- a/matching-brackets/matching_brackets.py +++ b/matching-brackets/matching_brackets.py @@ -1,2 +1,28 @@ -def is_paired(input_string): +""" +Matching Brackets. + +You're given the opportunity to write software for the Bracketeer™, +an ancient but powerful mainframe. The software that runs on it is +written in a proprietary language. Much of its syntax is familiar, +but you notice lots of brackets, braces and parentheses. Despite +the Bracketeer™ being powerful, it lacks flexibility. If the source +code has any unbalanced brackets, braces or parentheses, the Bracketeer™ +crashes and must be rebooted. To avoid such a scenario, you start writing +code that can verify that brackets, braces, and parentheses are balanced +before attempting to run it on the Bracketeer™. +""" + + +def is_paired(input_string: str) -> bool: + """ + Verify that any and all pairs of brackets are matched. + + Given a string containing brackets [], braces {}, parentheses (), + or any combination thereof, verify that any and all pairs are matched + and nested correctly. Any other characters should be ignored. For example, + "{what is (42)}?" is balanced and "[text}" is not. + + :param input_string: + :return: + """ pass diff --git a/matching-brackets/matching_brackets_test.py b/matching-brackets/matching_brackets_test.py index a8321d9..44da27f 100644 --- a/matching-brackets/matching_brackets_test.py +++ b/matching-brackets/matching_brackets_test.py @@ -1,3 +1,5 @@ +# pylint: disable=C0301 + # These tests are auto-generated with test data from: # https://github.com/exercism/problem-specifications/tree/main/exercises/matching-brackets/canonical-data.json # File last updated on 2023-07-19 From 3c27aedc34790c8a177c109db91ed4382c4890aa Mon Sep 17 00:00:00 2001 From: Egor Kostan Date: Sun, 31 Aug 2025 17:31:06 -0700 Subject: [PATCH 03/11] Update matching_brackets_test.py --- matching-brackets/matching_brackets_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matching-brackets/matching_brackets_test.py b/matching-brackets/matching_brackets_test.py index 44da27f..de554ef 100644 --- a/matching-brackets/matching_brackets_test.py +++ b/matching-brackets/matching_brackets_test.py @@ -1,4 +1,4 @@ -# pylint: disable=C0301 +# pylint: disable=C0301, C0114, C0115, C0116 # These tests are auto-generated with test data from: # https://github.com/exercism/problem-specifications/tree/main/exercises/matching-brackets/canonical-data.json From a6d5a6f789790d3c11c93b69086daa6aa9566733 Mon Sep 17 00:00:00 2001 From: Egor Kostan Date: Sun, 31 Aug 2025 18:44:28 -0700 Subject: [PATCH 04/11] Update matching_brackets.py --- matching-brackets/matching_brackets.py | 64 +++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/matching-brackets/matching_brackets.py b/matching-brackets/matching_brackets.py index ff5706e..6f989f7 100644 --- a/matching-brackets/matching_brackets.py +++ b/matching-brackets/matching_brackets.py @@ -12,6 +12,19 @@ before attempting to run it on the Bracketeer™. """ +import logging + +LEFT: str = "[{(" +RIGHT: str = "]})" +PAIRS: dict = { + "[": "]", + "{": "}", + "(": ")", + "]": "[", + "}": "{", + ")": "(", +} + def is_paired(input_string: str) -> bool: """ @@ -25,4 +38,53 @@ def is_paired(input_string: str) -> bool: :param input_string: :return: """ - pass + # Setup logging (console handler for visibility) + logging.basicConfig(level=logging.INFO, format="%(message)s") + logger = logging.getLogger(__name__) + logger.info("Processing text: %s", input_string) + + # Empty string + if not input_string: + logger.info("Empty string. Return True.") + return True + + # Remove all non bracket items and convert a string to a list. + brackets_list: list = [bracket for bracket in input_string if bracket in "(){}[]"] + + # Odd number of brackets + if len(brackets_list) % 2 != 0: + logger.info("Odd number of characters. Return False.") + return False + + paired: bool = True + while paired and brackets_list: + logger.info("brackets_list: %s", brackets_list) + for i, bracket in enumerate(brackets_list): + + if bracket in RIGHT: + paired = False + logger.info("Right side bracket found: %s. Return False.", bracket) + break + + if i + 1 < len(brackets_list): + if brackets_list[i + 1] != PAIRS[bracket] and brackets_list[-1] != PAIRS[bracket]: + paired = False + logger.info("No matching bracket found: %s. Return False.", bracket) + break + else: + if brackets_list[i + 1] == PAIRS[bracket]: + logger.info("Matching pair found: %s.", brackets_list[:2], ) + del brackets_list[1] + del brackets_list[0] + break + elif brackets_list[-1] == PAIRS[bracket]: + logger.info("Matching pair found: %s %s.", brackets_list[0], brackets_list[-1]) + del brackets_list[0] + del brackets_list[-1] + break + else: + paired = False + break + + logger.info("Is paired: %s", paired) + return paired From 3bf0d82e96677dfe6fcd434ffb90030d50cfa481 Mon Sep 17 00:00:00 2001 From: Egor Kostan Date: Sun, 31 Aug 2025 18:44:50 -0700 Subject: [PATCH 05/11] Update matching_brackets.py --- matching-brackets/matching_brackets.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/matching-brackets/matching_brackets.py b/matching-brackets/matching_brackets.py index 6f989f7..5793535 100644 --- a/matching-brackets/matching_brackets.py +++ b/matching-brackets/matching_brackets.py @@ -60,25 +60,34 @@ def is_paired(input_string: str) -> bool: while paired and brackets_list: logger.info("brackets_list: %s", brackets_list) for i, bracket in enumerate(brackets_list): - if bracket in RIGHT: paired = False logger.info("Right side bracket found: %s. Return False.", bracket) break if i + 1 < len(brackets_list): - if brackets_list[i + 1] != PAIRS[bracket] and brackets_list[-1] != PAIRS[bracket]: + if ( + brackets_list[i + 1] != PAIRS[bracket] + and brackets_list[-1] != PAIRS[bracket] + ): paired = False logger.info("No matching bracket found: %s. Return False.", bracket) break else: if brackets_list[i + 1] == PAIRS[bracket]: - logger.info("Matching pair found: %s.", brackets_list[:2], ) + logger.info( + "Matching pair found: %s.", + brackets_list[:2], + ) del brackets_list[1] del brackets_list[0] break elif brackets_list[-1] == PAIRS[bracket]: - logger.info("Matching pair found: %s %s.", brackets_list[0], brackets_list[-1]) + logger.info( + "Matching pair found: %s %s.", + brackets_list[0], + brackets_list[-1], + ) del brackets_list[0] del brackets_list[-1] break From f1860a2c53e14a876dd9a07cf68eadd2515c948f Mon Sep 17 00:00:00 2001 From: Egor Kostan Date: Sun, 31 Aug 2025 18:46:55 -0700 Subject: [PATCH 06/11] Update matching_brackets.py --- matching-brackets/matching_brackets.py | 36 +++++++++++++------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/matching-brackets/matching_brackets.py b/matching-brackets/matching_brackets.py index 5793535..521c3ea 100644 --- a/matching-brackets/matching_brackets.py +++ b/matching-brackets/matching_brackets.py @@ -73,24 +73,24 @@ def is_paired(input_string: str) -> bool: paired = False logger.info("No matching bracket found: %s. Return False.", bracket) break - else: - if brackets_list[i + 1] == PAIRS[bracket]: - logger.info( - "Matching pair found: %s.", - brackets_list[:2], - ) - del brackets_list[1] - del brackets_list[0] - break - elif brackets_list[-1] == PAIRS[bracket]: - logger.info( - "Matching pair found: %s %s.", - brackets_list[0], - brackets_list[-1], - ) - del brackets_list[0] - del brackets_list[-1] - break + + if brackets_list[i + 1] == PAIRS[bracket]: + logger.info( + "Matching pair found: %s.", + brackets_list[:2], + ) + del brackets_list[1] + del brackets_list[0] + break + elif brackets_list[-1] == PAIRS[bracket]: + logger.info( + "Matching pair found: %s %s.", + brackets_list[0], + brackets_list[-1], + ) + del brackets_list[0] + del brackets_list[-1] + break else: paired = False break From 9e9cf6ba6145eba7dd26f4033d6c30e1c3886df0 Mon Sep 17 00:00:00 2001 From: Egor Kostan Date: Sun, 31 Aug 2025 18:48:37 -0700 Subject: [PATCH 07/11] Update matching_brackets.py --- matching-brackets/matching_brackets.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/matching-brackets/matching_brackets.py b/matching-brackets/matching_brackets.py index 521c3ea..87427ea 100644 --- a/matching-brackets/matching_brackets.py +++ b/matching-brackets/matching_brackets.py @@ -82,7 +82,8 @@ def is_paired(input_string: str) -> bool: del brackets_list[1] del brackets_list[0] break - elif brackets_list[-1] == PAIRS[bracket]: + + if brackets_list[-1] == PAIRS[bracket]: logger.info( "Matching pair found: %s %s.", brackets_list[0], From 8f3dea74ad0012624e2049b0d733390f978076fb Mon Sep 17 00:00:00 2001 From: Egor Kostan Date: Sun, 31 Aug 2025 18:51:07 -0700 Subject: [PATCH 08/11] Update matching_brackets.py --- matching-brackets/matching_brackets.py | 46 ++++++++++++-------------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/matching-brackets/matching_brackets.py b/matching-brackets/matching_brackets.py index 87427ea..d7a0391 100644 --- a/matching-brackets/matching_brackets.py +++ b/matching-brackets/matching_brackets.py @@ -65,35 +65,31 @@ def is_paired(input_string: str) -> bool: logger.info("Right side bracket found: %s. Return False.", bracket) break - if i + 1 < len(brackets_list): - if ( + if ( brackets_list[i + 1] != PAIRS[bracket] and brackets_list[-1] != PAIRS[bracket] - ): - paired = False - logger.info("No matching bracket found: %s. Return False.", bracket) - break + ): + paired = False + logger.info("No matching bracket found: %s. Return False.", bracket) + break - if brackets_list[i + 1] == PAIRS[bracket]: - logger.info( - "Matching pair found: %s.", - brackets_list[:2], - ) - del brackets_list[1] - del brackets_list[0] - break + if brackets_list[i + 1] == PAIRS[bracket]: + logger.info( + "Matching pair found: %s.", + brackets_list[:2], + ) + del brackets_list[1] + del brackets_list[0] + break - if brackets_list[-1] == PAIRS[bracket]: - logger.info( - "Matching pair found: %s %s.", - brackets_list[0], - brackets_list[-1], - ) - del brackets_list[0] - del brackets_list[-1] - break - else: - paired = False + if brackets_list[-1] == PAIRS[bracket]: + logger.info( + "Matching pair found: %s %s.", + brackets_list[0], + brackets_list[-1], + ) + del brackets_list[0] + del brackets_list[-1] break logger.info("Is paired: %s", paired) From 28e6113ab8b71bdf26781f0c33529d1d58c078e4 Mon Sep 17 00:00:00 2001 From: Egor Kostan Date: Sun, 31 Aug 2025 18:52:26 -0700 Subject: [PATCH 09/11] Update matching_brackets.py --- matching-brackets/matching_brackets.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/matching-brackets/matching_brackets.py b/matching-brackets/matching_brackets.py index d7a0391..47fee34 100644 --- a/matching-brackets/matching_brackets.py +++ b/matching-brackets/matching_brackets.py @@ -66,8 +66,8 @@ def is_paired(input_string: str) -> bool: break if ( - brackets_list[i + 1] != PAIRS[bracket] - and brackets_list[-1] != PAIRS[bracket] + brackets_list[i + 1] != PAIRS[bracket] + and brackets_list[-1] != PAIRS[bracket] ): paired = False logger.info("No matching bracket found: %s. Return False.", bracket) From 76c59cb39bf419540d917a058be8e993b689ab3d Mon Sep 17 00:00:00 2001 From: Egor Kostan Date: Sun, 31 Aug 2025 19:05:09 -0700 Subject: [PATCH 10/11] Update matching_brackets.py --- matching-brackets/matching_brackets.py | 30 +++++--------------------- 1 file changed, 5 insertions(+), 25 deletions(-) diff --git a/matching-brackets/matching_brackets.py b/matching-brackets/matching_brackets.py index 47fee34..dba140a 100644 --- a/matching-brackets/matching_brackets.py +++ b/matching-brackets/matching_brackets.py @@ -12,17 +12,12 @@ before attempting to run it on the Bracketeer™. """ -import logging - LEFT: str = "[{(" RIGHT: str = "]})" PAIRS: dict = { "[": "]", "{": "}", "(": ")", - "]": "[", - "}": "{", - ")": "(", } @@ -38,14 +33,8 @@ def is_paired(input_string: str) -> bool: :param input_string: :return: """ - # Setup logging (console handler for visibility) - logging.basicConfig(level=logging.INFO, format="%(message)s") - logger = logging.getLogger(__name__) - logger.info("Processing text: %s", input_string) - # Empty string if not input_string: - logger.info("Empty string. Return True.") return True # Remove all non bracket items and convert a string to a list. @@ -53,44 +42,35 @@ def is_paired(input_string: str) -> bool: # Odd number of brackets if len(brackets_list) % 2 != 0: - logger.info("Odd number of characters. Return False.") return False paired: bool = True while paired and brackets_list: - logger.info("brackets_list: %s", brackets_list) for i, bracket in enumerate(brackets_list): + + # Right side bracket found if bracket in RIGHT: paired = False - logger.info("Right side bracket found: %s. Return False.", bracket) break + # No matching pair found if ( brackets_list[i + 1] != PAIRS[bracket] and brackets_list[-1] != PAIRS[bracket] ): paired = False - logger.info("No matching bracket found: %s. Return False.", bracket) break + # Matching pair found next to it if brackets_list[i + 1] == PAIRS[bracket]: - logger.info( - "Matching pair found: %s.", - brackets_list[:2], - ) del brackets_list[1] del brackets_list[0] break + # Matching pair found at the end of the list if brackets_list[-1] == PAIRS[bracket]: - logger.info( - "Matching pair found: %s %s.", - brackets_list[0], - brackets_list[-1], - ) del brackets_list[0] del brackets_list[-1] break - logger.info("Is paired: %s", paired) return paired From 069acaa7ffa4933cbff8eef585073a2d5a044c44 Mon Sep 17 00:00:00 2001 From: Egor Kostan Date: Sun, 31 Aug 2025 20:08:54 -0700 Subject: [PATCH 11/11] Update matching_brackets.py --- matching-brackets/matching_brackets.py | 1 - 1 file changed, 1 deletion(-) diff --git a/matching-brackets/matching_brackets.py b/matching-brackets/matching_brackets.py index dba140a..354c129 100644 --- a/matching-brackets/matching_brackets.py +++ b/matching-brackets/matching_brackets.py @@ -47,7 +47,6 @@ def is_paired(input_string: str) -> bool: paired: bool = True while paired and brackets_list: for i, bracket in enumerate(brackets_list): - # Right side bracket found if bracket in RIGHT: paired = False