From 03de3587bdac1f610368d5d23cdb4a8350f2472d Mon Sep 17 00:00:00 2001 From: dece Date: Fri, 18 Dec 2020 13:02:09 +0100 Subject: [PATCH] Day 18 --- 2020/day18.py | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 2020/day18.py diff --git a/2020/day18.py b/2020/day18.py new file mode 100644 index 0000000..f0834dd --- /dev/null +++ b/2020/day18.py @@ -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()