#advent of code 2020 #day 18 #in my first or second aoc I coded a function to find nested brackets #that was painful and Im not doing it again #therefore regex import re def calcAdvanced(equation): #part 2 while True: try: lb, ub = re.search(r'(\d)+\s{1}(\+){1}(\s){1}\d+', equation).span(); subequation = equation[lb:ub].split(" "); equation = equation[0:lb] + str(calcOperators(subequation)) + equation[ub:]; except: break; return int(eval(equation)); def calcOperators(values): #part 1 prev = values[0]; for v in range(2,len(values),2): prev = str(eval(prev+values[v-1]+values[v])); return prev; def calcBrackets(eq,part): while True: try: lb, ub = re.search(r'\({1}([\d]|[\s]|[*]|[+])+\){1}', eq).span(); if part == 1: subeq = eq[lb+1:ub-1].split(" "); newval = str(calcOperators(subeq)); else: subeq = eq[lb:ub]; newval = str(calcAdvanced(subeq)); eq = eq[0:lb] + newval + eq[ub:]; except: break; if part == 1: subeq = eq.split(" "); return int(calcOperators(subeq)); else: return int(calcAdvanced(eq)); p1 = 0; p2 = 0; PuzzleInput = open("18.in","r"); for line in PuzzleInput: line = line[:-1]; p1 += calcBrackets(line,1); p2 += calcBrackets(line,2); PuzzleInput.close(); print("part 1 =",p1); print("part 2 =",p2);