This commit is contained in:
dece 2020-12-18 13:02:09 +01:00
parent 94f8d2f443
commit 03de3587bd

54
2020/day18.py Normal file
View file

@ -0,0 +1,54 @@
import re
import sys
SUBEXPR = re.compile(r"\([^\(\)]+\)")
def main():
lines = [line.rstrip() for line in sys.stdin]
# Part 1
acc = 0
for line in lines:
while (subexprs := list(SUBEXPR.finditer(line))):
for sub in subexprs:
sub_text = sub.group(0)
value = spacemath(sub_text.strip("()").split())
line = line.replace(sub_text, str(value), 1)
acc += spacemath(line.split())
print("Sum:", acc)
# Part 2
acc = 0
for line in lines:
while (subexprs := list(SUBEXPR.finditer(line))):
for sub in subexprs:
sub_text = sub.group(0)
value = advanced(sub_text.strip("()").split())
line = line.replace(sub_text, str(value), 1)
acc += advanced(line.split())
print("Sum with advanced math:", acc)
def spacemath(tokens):
acc = int(tokens[0])
for i in range(1, len(tokens) - 1, 2):
op, rhs = tokens[i], tokens[i + 1]
acc = (acc + int(rhs)) if op == "+" else (acc * int(rhs))
return acc
def advanced(tokens):
while len(tokens) > 1: # solve additions first
try:
i = tokens.index("+")
except ValueError:
break
simplification = int(tokens[i - 1]) + int(tokens[i + 1])
tokens[i - 1:i + 2] = [simplification]
return spacemath(tokens) # lazily reuse spacemath for multiplication
if __name__ == "__main__":
main()