64 lines
1.7 KiB
Python
64 lines
1.7 KiB
Python
|
def read_file():
|
||
|
with open("input.txt","r") as f:
|
||
|
return f.read().split('\n')
|
||
|
|
||
|
import re
|
||
|
|
||
|
def compute(problem):
|
||
|
"""Add and multiply at the same precedence."""
|
||
|
problem = problem.replace(" ","")
|
||
|
# handle parens
|
||
|
if s := re.search(r'(\((\d+)(([+*])(\d+))+\))',problem):
|
||
|
expr = s.groups()[0]
|
||
|
recurser = str(compute(s.groups()[0][1:-1]))
|
||
|
problem = problem.replace(expr, recurser, 1)
|
||
|
return compute(problem)
|
||
|
# handle ops
|
||
|
if s := re.match(r"(\d+)([+*])(\d+)", problem):
|
||
|
a, op, b = s.groups()
|
||
|
expr = s.group()
|
||
|
reducer = str(
|
||
|
int(a) + int(b)
|
||
|
if op == "+"
|
||
|
else int(a) * int(b)
|
||
|
)
|
||
|
problem = problem.replace(expr, reducer, 1)
|
||
|
return compute(problem)
|
||
|
return int(problem)
|
||
|
|
||
|
def compute2(problem):
|
||
|
"""Add, then multiply."""
|
||
|
problem = problem.replace(" ","")
|
||
|
# handle parens
|
||
|
if s := re.search(r'(\((\d+)(([+*])(\d+))+\))',problem):
|
||
|
expr = s.groups()[0]
|
||
|
recurser = str(compute2(s.groups()[0][1:-1]))
|
||
|
problem = problem.replace(expr, recurser, 1)
|
||
|
return compute2(problem)
|
||
|
# handle add
|
||
|
if s := re.search(r"(\d+)\+(\d+)", problem):
|
||
|
expr = s.group()
|
||
|
print(s.groups()[1])
|
||
|
reducer = str(int(s.groups()[0]) + int(s.groups()[1]))
|
||
|
problem = problem.replace(expr, reducer, 1)
|
||
|
return compute2(problem)
|
||
|
# handle multiply
|
||
|
if s := re.match(r"(\d+)\*(\d+)", problem):
|
||
|
expr = s.group()
|
||
|
reducer = str(int(s.groups()[0]) * int(s.groups()[1]))
|
||
|
problem = problem.replace(expr, reducer, 1)
|
||
|
return compute2(problem)
|
||
|
return int(problem)
|
||
|
|
||
|
def part1(problems):
|
||
|
return sum([compute(problem) for problem in problems])
|
||
|
|
||
|
def part2(problems):
|
||
|
return sum([compute2(problem) for problem in problems])
|
||
|
|
||
|
def main():
|
||
|
problems = read_file()
|
||
|
print(part1(problems), part2(problems))
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
main()
|