def balanced(brackets: str) -> bool:
closing_brackets = (")", "]", "}")
opening_brackets = ("(", "[", "{")
checks = {
open_brace: close_brace
for open_brace, close_brace in zip(opening_brackets, closing_brackets)
}
if not brackets or brackets in closing_brackets:
return False
stack = []
for bracket in brackets:
if bracket in opening_brackets:
stack.append(bracket)
elif bracket in closing_brackets and stack:
if checks[stack[-1]]:
stack.pop()
else:
return False
return True if not stack else False
TESTS = [
("(", False),
(")", False),
("()", True),
("(())", True),
("(()))", False),
("[", False),
("]", False),
("[]", True),
("[[]]", True),
("[[]]]", False),
("{", False),
("}", False),
("{}", True),
("{{}}", True),
("{{}}}", False),
("[(])", False), # TODO: This fails.
]
def run_tests() -> None:
for given, expected in TESTS:
assert balanced(given) == expected, (given, expected)
run_tests()