summaryrefslogtreecommitdiff
path: root/2020/aoc2020-d18.py
diff options
context:
space:
mode:
Diffstat (limited to '2020/aoc2020-d18.py')
-rw-r--r--2020/aoc2020-d18.py53
1 files changed, 53 insertions, 0 deletions
diff --git a/2020/aoc2020-d18.py b/2020/aoc2020-d18.py
new file mode 100644
index 0000000..8bcdbe1
--- /dev/null
+++ b/2020/aoc2020-d18.py
@@ -0,0 +1,53 @@
+#advent of code 2020
+#day 18
+#in my first or second aoc I coded a function to find nested brackets
+#that was painful and Im not doing it again
+#therefore regex
+
+import re
+
+def calcAdvanced(equation): #part 2
+ while True:
+ try:
+ lb, ub = re.search(r'(\d)+\s{1}(\+){1}(\s){1}\d+', equation).span();
+ subequation = equation[lb:ub].split(" ");
+ equation = equation[0:lb] + str(calcOperators(subequation)) + equation[ub:];
+ except:
+ break;
+ return int(eval(equation));
+
+def calcOperators(values): #part 1
+ prev = values[0];
+ for v in range(2,len(values),2):
+ prev = str(eval(prev+values[v-1]+values[v]));
+ return prev;
+
+def calcBrackets(eq,part):
+ while True:
+ try:
+ lb, ub = re.search(r'\({1}([\d]|[\s]|[*]|[+])+\){1}', eq).span();
+ if part == 1:
+ subeq = eq[lb+1:ub-1].split(" ");
+ newval = str(calcOperators(subeq));
+ else:
+ subeq = eq[lb:ub];
+ newval = str(calcAdvanced(subeq));
+ eq = eq[0:lb] + newval + eq[ub:];
+ except:
+ break;
+ if part == 1:
+ subeq = eq.split(" ");
+ return int(calcOperators(subeq));
+ else:
+ return int(calcAdvanced(eq));
+
+p1 = 0;
+p2 = 0;
+PuzzleInput = open("18.in","r");
+for line in PuzzleInput:
+ line = line[:-1];
+ p1 += calcBrackets(line,1);
+ p2 += calcBrackets(line,2);
+PuzzleInput.close();
+print("part 1 =",p1);
+print("part 2 =",p2);