Day 18
This commit is contained in:
parent
94f8d2f443
commit
03de3587bd
54
2020/day18.py
Normal file
54
2020/day18.py
Normal 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()
|
Loading…
Reference in a new issue