Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
Readable solution in Clear category for Brackets by alterGNU
def checkio(expression):
dico = {"{":"}","(":")","[":"]"} # dict that as openBrackets as key and closeBrackets as values
obs = set(dico.keys()) # set of open brackets
cbs = set(dico.values()) # set of close brackets
# this list contain only brackets since nothing else matters...
metallica=[x for x in expression if x in {"{","}","(",")","[","]"}]
# looping while metallica not empty
while len(metallica)>0:
size=len(metallica)
if (size%2 != 0) : # metallica must always be pair
return False
ob=size # Index of the last Open Bracket found in metallica
cb=size # Index of the first Close Bracket found in metallica
for i in range(size):
if metallica[i] in obs: # metallica[ob] = last open bracket found in metallica[0:i+1]
ob=i
elif metallica[i] in cbs:# when first close bracket found, stop it!
cb=i
break
# test not working cases :
t1 = (ob == size) # if close bracket before open bracket
t2 = (cb == size) # if no close bracket found
# last open bracket found not matching with first close bracket found
t3 = (dico[metallica[ob]] != metallica[cb])
if t1 or t2 or t3:
return False
# delete interval between matching bracket from metallica
metallica = metallica[:ob]+metallica[cb+1:]
return True
#These "asserts" using only for self-checking and not necessary for auto-testing
if __name__ == '__main__':
assert checkio("((5+3)*2+1)") == True, "Simple"
assert checkio("{[(3+1)+2]+}") == True, "Different types"
assert checkio("(3+{1-1)}") == False, ") is alone inside {}"
assert checkio("[1+1]+(2*2)-{3/3}") == True, "Different operators"
assert checkio("(({[(((1)-2)+3)-3]/3}-3)") == False, "One is redundant"
assert checkio("2+3") == True, "No brackets, no problem"
May 15, 2021