1
1
import os
2
+ from copy import deepcopy
3
+
4
+ class FirewallSolver :
2
5
3
- class Firewall :
4
6
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 ):
5
43
self .layers = []
6
44
self .parse (layers )
7
- self .hacker = 0
45
+ self .hacker = False
8
46
self .severity = 0
9
- self .layers [ self . hacker ]. hacker = True
47
+ self .delay ( delayed )
10
48
11
49
def __iter__ (self ):
12
50
return self
@@ -17,26 +55,49 @@ def __repr__(self):
17
55
def __str__ (self ):
18
56
return str (self .layers )
19
57
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
+
20
84
def parse (self , layers ):
21
85
for layer in layers :
22
86
d , r = layer .split (':' )
23
87
self .layers .append (Layer (int (d ), int (r )))
24
88
return self .layers
25
89
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 ):
36
91
for i in range (0 , len (self .layers )):
37
92
next (self )
38
93
return self .severity
39
94
95
+ def delay (self , delayed ):
96
+ while delayed > 0 :
97
+ next (self )
98
+ delayed -= 1
99
+ return self
100
+
40
101
class Layer :
41
102
def __init__ (self , depth , rnge ):
42
103
self .depth = depth
@@ -65,13 +126,16 @@ def __str__(self):
65
126
def __iter__ (self ):
66
127
return self
67
128
68
- def next (self ):
129
+ def __next__ (self ):
69
130
severity = self .severity ()
70
131
self .scanner += self .direction
71
132
if (self .scanner == self .range - 1 ) or (self .scanner == 0 ):
72
133
self .direction = - self .direction
73
134
return severity
74
135
136
+ def caught (self ):
137
+ return self .hacker and self .scanner == 0
138
+
75
139
def severity (self ):
76
140
if self .hacker and self .scanner == 0 and self .range > 1 :
77
141
return self .depth * self .range
@@ -85,4 +149,8 @@ def severity(self):
85
149
f = open (file_path )
86
150
data = f .read ().split ('\n ' )
87
151
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