-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path11.py
76 lines (58 loc) · 1.73 KB
/
11.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
def print_m(octs):
return
for o in octs:
print(o)
print("\n")
def valid_position(i, j):
not_valid = i < 0 or i >= len(octs) or j < 0 or j >= len(octs[0])
return not not_valid
def dfs(i, j, flashed, octs):
if not valid_position(i, j):
return # Invalid position
if (i, j) in flashed:
return
if octs[i][j] <= 9:
return
flashed.add((i, j))
for di in [-1, 0, 1]:
for dj in [-1, 0, 1]:
if di != 0 or dj != 0:
if not valid_position(i + di, j + dj):
continue
octs[i + di][j + dj] += 1
dfs(i + di, j + dj, flashed, octs)
def one_step(octs):
flashed = set()
# first increment each by 1
for i in range(len(octs)):
for j in range(len(octs[0])):
octs[i][j] += 1
# count flashes and trigger more flashes
for i in range(len(octs)):
for j in range(len(octs[0])):
dfs(i, j, flashed, octs)
sync = True
for i in range(len(octs)):
for j in range(len(octs[0])):
if octs[i][j] > 9:
octs[i][j] = 0
else:
sync = False
return len(flashed), sync
def solve1(octs, n_steps, second=False):
n_flashes = 0
n_steps = 100000000 if second else n_steps
for k in range(n_steps):
print_m(octs)
step_flashes, sync = one_step(octs)
if sync and second:
print_m(octs)
return k + 1
n_flashes += step_flashes
return n_flashes
with open("11.txt", "r") as file:
s = file.read()
matrix = s[:-1].split('\n')
octs = [[int(energy_level) for energy_level in row] for row in matrix]
print_m(octs)
print(solve1(octs, 100, True))