-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathday_18.py
111 lines (93 loc) · 2.79 KB
/
day_18.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
#!/usr/bin/env python3
"""Advent of Code 2020 Day 18 - Operation Order."""
def do_maths(maths: list) -> int:
"""."""
num_1 = None
num_2 = None
operation = None
bracketed_start = None
bracketed_end = None
bracket_depth = 0
for index, char in enumerate(maths):
if char == '+':
if not bracketed_start:
operation = '+'
elif char == '*':
if not bracketed_start:
operation = '*'
elif char == '(':
if not bracketed_start:
bracketed_start = index + 1
else:
bracket_depth += 1
elif char == ')':
if bracketed_start and bracket_depth == 0:
bracketed_end = index
result = do_maths(maths[bracketed_start:bracketed_end])
if not num_1:
num_1 = result
else:
num_2 = result
bracketed_start = bracket_end = None
else:
bracket_depth -= 1
elif not bracketed_start:
if not num_1:
num_1 = int(char)
else:
num_2 = int(char)
if num_1 and num_2:
if operation == '+':
num_1 = num_1 + num_2
num_2 = None
else:
num_1 = num_1 * num_2
num_2 = None
return num_1
with open('inputs/day_18.txt', 'r') as f:
rows = [row.split() for row in f.readlines()]
parsed_rows = []
for row in rows:
parsed_row = []
for item in row:
if item.startswith('('):
for index, char in enumerate(item):
if char == '(':
parsed_row.append(char)
else:
parsed_row.extend(item[index:])
elif item.endswith(')'):
adjacent_item = ''
for char in item:
if char == ')':
if adjacent_item:
parsed_row.append(adjacent_item)
adjacent_item = ''
parsed_row.append(char)
else:
adjacent_item += char
else:
parsed_row.append(item)
parsed_rows.append(parsed_row)
rows = parsed_rows.copy()
total = 0
for row in rows:
result = do_maths(row)
total += result
# Answer One
print("Sum of the lines' values:", total)
total = 0
for row in rows:
mod_row = ['(']
for item in row:
if item in ('(', ')'):
mod_row.extend([item, item])
elif item == '*':
mod_row.extend([')', '*', '('])
else:
mod_row.append(item)
mod_row.append(')')
result = do_maths(mod_row)
total += result
# Answer Two
print("Sum of the lines' values after new rules:", total)