aoc2020/day18.py
2020-12-18 07:20:31 +01:00

58 lines
1.8 KiB
Python

import aoclib
import re
DAY = 18
TEST_SOLUTION_PART1 = 26457
TEST_SOLUTION_PART2 = 694173
r_parentheses = re.compile(r'(\([^()]+\))')
r_calc = re.compile(r'^(\d+([*+])\d+)')
r_add = re.compile(r'[^+0-9]?(\d+\+\d+)')
r_mul = re.compile(r'[^*0-9]?(\d+\*\d+)')
def calculate(expression, add_pred=False):
while "(" in expression:
for parentheses in re.findall(r_parentheses, expression):
expression = expression.replace(parentheses, str(calculate(parentheses[1:-1], add_pred)), 1)
if not add_pred:
while "+" in expression or "*" in expression:
calc = re.match(r_calc, expression)[0]
expression = expression.replace(calc, str(eval(calc)), 1)
else:
while "+" in expression:
for addition in re.findall(r_add, expression):
left, right = addition.split('+')
expression = re.sub(
"(^|[*+])%s($|[+*])" % addition.replace('+', '\+'),
"\g<1>%s\g<2>" % (int(left) + int(right)),
expression
)
while "*" in expression:
for multiplication in re.findall(r_mul, expression):
left, right = multiplication.split('*')
expression = re.sub(
"(^|[*+])%s($|[+*])" % multiplication.replace('*', '\*'),
"\g<1>%s\g<2>" % (int(left) * int(right)),
expression
)
return int(expression)
def part1(test_mode=False, add_pred=False):
my_input = aoclib.getInputAsArray(day=DAY, test=test_mode)
result = 0
for line in my_input:
line = line.replace(" ", "")
result += calculate(line, add_pred)
return result
def part2(test_mode=False):
return part1(test_mode, add_pred=True)