Skip to content

Commit b22f5a7

Browse files
committed
Day13, 2017 - Part II
1 parent eb8015f commit b22f5a7

File tree

1 file changed

+83
-15
lines changed

1 file changed

+83
-15
lines changed

2017/day13.py

+83-15
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,50 @@
11
import os
2+
from copy import deepcopy
3+
4+
class FirewallSolver:
25

3-
class Firewall:
46
def __init__(self, layers):
7+
self.layers = layers
8+
self.picoseconds = 0
9+
self.firewall = Firewall(self.layers, self.picoseconds)
10+
self.solved = False
11+
12+
def __iter__(self):
13+
return self
14+
15+
def __next__(self):
16+
firewall = self.firewall
17+
fw_delayed = deepcopy(firewall)
18+
fw_delayed.delay(1)
19+
firewall.set_hacker()
20+
caught = firewall.caught()
21+
if caught:
22+
self.picoseconds += 1
23+
self.firewall = fw_delayed
24+
return self
25+
else:
26+
self.solved = True
27+
return self
28+
29+
def delay(self, n):
30+
self.picoseconds += n
31+
self.firewall.delay(n)
32+
return 'Delayed ' + str(n) + ' steps'
33+
34+
def solve(self):
35+
while not self.solved:
36+
next(self)
37+
if self.picoseconds % 1000 == 0:
38+
print(self.picoseconds)
39+
return self.picoseconds
40+
41+
class Firewall:
42+
def __init__(self, layers, delayed = 0):
543
self.layers = []
644
self.parse(layers)
7-
self.hacker = 0
45+
self.hacker = False
846
self.severity = 0
9-
self.layers[self.hacker].hacker = True
47+
self.delay(delayed)
1048

1149
def __iter__(self):
1250
return self
@@ -17,26 +55,49 @@ def __repr__(self):
1755
def __str__(self):
1856
return str(self.layers)
1957

58+
def __next__(self):
59+
for layer in self.layers:
60+
self.severity += next(layer)
61+
if self.hacker:
62+
self.layers[self.h_index].hacker = False
63+
self.h_index += 1
64+
if self.h_index < len(self.layers):
65+
self.layers[self.h_index].hacker = True
66+
return self
67+
68+
def caught(self):
69+
for i in range(0, len(self.layers)):
70+
if self.currently_caught():
71+
return True
72+
else:
73+
next(self)
74+
return False
75+
76+
def currently_caught(self):
77+
return any([l.caught() for l in self.layers])
78+
79+
def set_hacker(self):
80+
self.hacker = True
81+
self.h_index = 0
82+
self.layers[self.h_index].hacker = True
83+
2084
def parse(self, layers):
2185
for layer in layers:
2286
d, r = layer.split(':')
2387
self.layers.append(Layer(int(d), int(r)))
2488
return self.layers
2589

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):
90+
def compute_severity(self):
3691
for i in range(0, len(self.layers)):
3792
next(self)
3893
return self.severity
3994

95+
def delay(self, delayed):
96+
while delayed > 0:
97+
next(self)
98+
delayed -= 1
99+
return self
100+
40101
class Layer:
41102
def __init__(self, depth, rnge):
42103
self.depth = depth
@@ -65,13 +126,16 @@ def __str__(self):
65126
def __iter__(self):
66127
return self
67128

68-
def next(self):
129+
def __next__(self):
69130
severity = self.severity()
70131
self.scanner += self.direction
71132
if (self.scanner == self.range-1) or (self.scanner == 0):
72133
self.direction = -self.direction
73134
return severity
74135

136+
def caught(self):
137+
return self.hacker and self.scanner == 0
138+
75139
def severity(self):
76140
if self.hacker and self.scanner == 0 and self.range > 1:
77141
return self.depth * self.range
@@ -85,4 +149,8 @@ def severity(self):
85149
f = open(file_path)
86150
data = f.read().split('\n')
87151
fw = Firewall(data)
88-
print(fw.solve())
152+
fw.set_hacker()
153+
print(fw.compute_severity())
154+
solver = FirewallSolver(data)
155+
solver.delay(3060000)
156+
print(solver.solve())

0 commit comments

Comments
 (0)