-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsol18.py
137 lines (91 loc) · 3.1 KB
/
sol18.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import utils
import re
import math
import copy
def initialise():
global expressions, numbers
expressions = utils.loadInputFile("input_18.txt")
numbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
def process():
global operandStack, operationStack
op = operationStack.pop()
if op == "(":
return
x = operandStack.pop()
y = operandStack.pop()
if op == "+":
z = int(x) + int(y)
elif op == "*":
z = int(x) * int(y)
operandStack.append(str(z))
def part1():
global expressions, numbers, operandStack, operationStack
totalSum = 0
for expression in expressions:
# strip whitespace
expression = expression.replace(" ", "")
operandStack = []
operationStack = []
for char in expression:
if char in numbers:
operandStack.append(char)
elif (char == "+" or char == "*") and len(operationStack) == 0:
operationStack.append(char)
elif (char == "+" or char == "*") and len(operationStack) != 0:
process()
operationStack.append(char)
elif char == "(":
operationStack.append(char)
elif char == ")":
process()
else:
process()
while len(operationStack) > 0:
process()
totalSum += int(operandStack[0])
return totalSum
def part2():
global expressions, numbers, operandStack, operationStack
totalSum = 0
for expression in expressions:
# strip whitespace
expression = expression.replace(" ", "")
operandStack = []
operationStack = []
idx = 0
while idx < len(expression):
char = expression[idx]
if char in numbers:
operandStack.append(char)
elif (char == "+" or char == "*") and len(operationStack) == 0:
operationStack.append(char)
elif char == "+" and len(operationStack) != 0:
operationStack.append(char)
elif char == "*":
# if we have +'s on top of the stack, these should be processed first
# as they take precedence
if operationStack[-1] == "+":
process()
while len(operationStack) > 0 and operationStack[-1] == "+":
process()
operationStack.append(char)
elif operationStack[-1] == "(":
operationStack.append(char)
else:
operationStack.append(char)
elif char == "(":
operationStack.append(char)
elif char == ")":
while operationStack[-1] != "(":
process()
operationStack.pop()
else:
process()
idx += 1
while len(operationStack) > 0:
process()
totalSum += int(operandStack[0])
return totalSum
initialise()
print(part1()) # 209335026987
print(part2()) # 33331817392479