Skip to content

Commit eb8015f

Browse files
committed
Day 13, 2017 - Part I
1 parent 8bab12c commit eb8015f

File tree

3 files changed

+184
-0
lines changed

3 files changed

+184
-0
lines changed

2017/day13.py

+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import os
2+
3+
class Firewall:
4+
def __init__(self, layers):
5+
self.layers = []
6+
self.parse(layers)
7+
self.hacker = 0
8+
self.severity = 0
9+
self.layers[self.hacker].hacker = True
10+
11+
def __iter__(self):
12+
return self
13+
14+
def __repr__(self):
15+
return self.__str__()
16+
17+
def __str__(self):
18+
return str(self.layers)
19+
20+
def parse(self, layers):
21+
for layer in layers:
22+
d, r = layer.split(':')
23+
self.layers.append(Layer(int(d), int(r)))
24+
return self.layers
25+
26+
def next(self):
27+
for layer in self.layers:
28+
self.severity += next(layer)
29+
self.layers[self.hacker].hacker = False
30+
self.hacker += 1
31+
if self.hacker < len(self.layers):
32+
self.layers[self.hacker].hacker = True
33+
return self
34+
35+
def solve(self):
36+
for i in range(0, len(self.layers)):
37+
next(self)
38+
return self.severity
39+
40+
class Layer:
41+
def __init__(self, depth, rnge):
42+
self.depth = depth
43+
self.range = rnge
44+
self.scanner = 0
45+
self.direction = 1
46+
self.empty = (self.range == 1)
47+
self.hacker = False
48+
49+
def __repr__(self):
50+
return self.__str__()
51+
52+
def __str__(self):
53+
if self.empty:
54+
if self.hacker:
55+
return str(['X'])
56+
else:
57+
return str([])
58+
else:
59+
arr = [[] for i in range(0, self.range)]
60+
arr[self.scanner] = ['S']
61+
if self.hacker:
62+
arr[0].append('X')
63+
return str(arr)
64+
65+
def __iter__(self):
66+
return self
67+
68+
def next(self):
69+
severity = self.severity()
70+
self.scanner += self.direction
71+
if (self.scanner == self.range-1) or (self.scanner == 0):
72+
self.direction = -self.direction
73+
return severity
74+
75+
def severity(self):
76+
if self.hacker and self.scanner == 0 and self.range > 1:
77+
return self.depth * self.range
78+
else:
79+
return 0
80+
81+
82+
if __name__ == '__main__':
83+
rel_path = os.path.dirname(os.path.abspath(__file__))
84+
file_path = os.path.join(rel_path, "inputs/day13.txt")
85+
f = open(file_path)
86+
data = f.read().split('\n')
87+
fw = Firewall(data)
88+
print(fw.solve())

2017/inputs/day13.txt

+89
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
0: 4
2+
1: 2
3+
2: 3
4+
3: 1
5+
4: 4
6+
5: 1
7+
6: 8
8+
7: 1
9+
8: 5
10+
9: 1
11+
10: 8
12+
11: 1
13+
12: 6
14+
13: 1
15+
14: 6
16+
15: 1
17+
16: 8
18+
17: 1
19+
18: 6
20+
19: 1
21+
20: 6
22+
21: 1
23+
22: 12
24+
23: 1
25+
24: 12
26+
25: 1
27+
26: 10
28+
27: 1
29+
28: 8
30+
29: 1
31+
30: 12
32+
31: 1
33+
32: 8
34+
33: 1
35+
34: 12
36+
35: 1
37+
36: 9
38+
37: 1
39+
38: 12
40+
39: 1
41+
40: 8
42+
41: 1
43+
42: 12
44+
43: 1
45+
44: 17
46+
45: 1
47+
46: 14
48+
47: 1
49+
48: 12
50+
49: 1
51+
50: 10
52+
51: 1
53+
52: 20
54+
53: 1
55+
54: 12
56+
55: 1
57+
56: 14
58+
57: 1
59+
58: 14
60+
59: 1
61+
60: 14
62+
61: 1
63+
62: 12
64+
63: 1
65+
64: 14
66+
65: 1
67+
66: 14
68+
67: 1
69+
68: 14
70+
69: 1
71+
70: 14
72+
71: 1
73+
72: 12
74+
73: 1
75+
74: 14
76+
75: 1
77+
76: 14
78+
77: 1
79+
78: 1
80+
79: 1
81+
80: 14
82+
81: 1
83+
82: 1
84+
83: 1
85+
84: 18
86+
85: 1
87+
86: 1
88+
87: 1
89+
88: 14

2017/inputs/day13_test.txt

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
0: 3
2+
1: 2
3+
2: 1
4+
3: 1
5+
4: 4
6+
5: 1
7+
6: 4

0 commit comments

Comments
 (0)