Given an expression formed only with parentheses, return whether they are
balanced.
import%20marimo%20as%20mo%0A%0Ais_balanced_code_editor%20%3D%20mo.ui.code_editor(%22%22%22def%20is_balanced(expression%3A%20str)%3A%0A%20%20%20%20balance%20%3D%200%0A%20%20%20%20for%20char%20in%20expression%3A%0A%20%20%20%20%20%20%20%20if%20char%20%3D%3D%20%22(%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20balance%20%2B%3D%201%0A%20%20%20%20%20%20%20%20elif%20char%20%3D%3D%20%22)%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20balance%20-%3D%201%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20balance%20%3C%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20False%0A%20%20%20%20return%20balance%20%3D%3D%200%22%22%22%2C%20theme%3D%22dark%22)%0Ais_balanced_code_editor
import%20traceback%0A%0Ais_balanced%20%3D%20None%0Areverse%20%3D%20None%0Awith%20mo.redirect_stderr()%2C%20mo.redirect_stdout()%3A%0A%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20exec(is_balanced_code_editor.value)%0A%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20print(%22Errors%20in%20your%20code%3A%22)%0A%20%20%20%20%20%20%20%20traceback.print_exc()
test_cases%20%3D%20%5B%0A%20%20%20%20(%22%22%2C%20True)%2C%0A%20%20%20%20(%22()%22%2C%20True)%2C%0A%20%20%20%20(%22()()%22%2C%20True)%2C%0A%20%20%20%20(%22(())%22%2C%20True)%2C%0A%20%20%20%20(%22(()(()))%22%2C%20True)%2C%0A%20%20%20%20(%22)(%22%2C%20False)%2C%0A%20%20%20%20(%22(()%22%2C%20False)%2C%0A%20%20%20%20(%22())%22%2C%20False)%2C%0A%20%20%20%20(%22(()))(%22%2C%20False)%2C%0A%20%20%20%20(%22()(()())%22%2C%20True)%2C%0A%20%20%20%20(%22((())(()))%22%2C%20True)%2C%0A%20%20%20%20(%22(()(()(())))%22%2C%20True)%2C%0A%20%20%20%20(%22(((((((((())))))))))%22%2C%20True)%2C%0A%20%20%20%20(%22(((((((()%22%2C%20False)%2C%0A%20%20%20%20(%22(()))))%22%2C%20False)%2C%0A%5D%0A%0Arows%20%3D%20%5B%0A%20%20%20%20%22%7C%20Input%20%7C%20Expected%20%7C%20Actual%20%7C%20Result%20%7C%22%2C%0A%20%20%20%20%22%7C-------%7C----------%7C--------%7C--------%7C%22%0A%5D%0A%0Afor%20s%2C%20expected%20in%20test_cases%3A%0A%20%20%20%20error%20%3D%20None%0A%20%20%20%20actual%20%3D%20None%0A%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20actual%20%3D%20is_balanced(s)%0A%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20error%20%3D%20e%0A%20%20%20%20result%20%3D%20%22%E2%9C%85%22%20if%20actual%20%3D%3D%20expected%20else%20%22%E2%9D%8C%22%20if%20not%20error%20else%20f%22%F0%9F%92%A5%20%7Bstr(error)%7D%22%0A%20%20%20%20rows.append(f%22%7C%20%60%7Bs%7D%60%20%7C%20%60%7Bexpected%7D%60%20%7C%20%60%7Bactual%7D%60%20%7C%20%7Bresult%7D%20%7C%22)%0A%0Amo.md(%22%5Cn%22.join(rows))