Skip to content

Commit 9fe80a7

Browse files
committed
feat: add solution 2021 11th
1 parent 1e69da5 commit 9fe80a7

File tree

5 files changed

+243
-0
lines changed

5 files changed

+243
-0
lines changed

2021/11/input

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
4341347643
2+
5477728451
3+
2322733878
4+
5453762556
5+
2718123421
6+
4237886115
7+
5631617114
8+
2217667227
9+
4236581255
10+
4482627641

2021/11/puzzle1.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import os
2+
import sys
3+
import typing
4+
5+
6+
def main():
7+
with open(os.path.join(sys.path[0], 'input'), 'r') as input_file:
8+
print(puzzle1(input_file))
9+
10+
11+
def puzzle1(input_file: typing.TextIO, steps: int = 100):
12+
rows = []
13+
14+
for row in input_file:
15+
rows.append([int(number) for number in row.strip()])
16+
17+
grid = OctopusGrid(rows)
18+
19+
for i in range(0, steps):
20+
grid.apply_step()
21+
22+
return grid.get_flashes_count()
23+
24+
25+
class OctopusGrid:
26+
grid: [[int]]
27+
flashes: int
28+
29+
def __init__(self, grid: [[int]]):
30+
self.grid = grid
31+
self.flashes = 0
32+
33+
def apply_step(self):
34+
seen = set()
35+
36+
for row_number in range(0, len(self.grid)):
37+
for column_number in range(0, len(self.grid[row_number])):
38+
self._increase_octopus_energy(row_number, column_number, seen)
39+
40+
def _increase_octopus_energy(self, row_number: int, column_number: int, seen: set):
41+
if row_number < 0 or row_number >= len(self.grid) or \
42+
column_number < 0 or column_number >= len(self.grid[row_number]):
43+
return
44+
45+
position = (row_number, column_number)
46+
if position in seen:
47+
return
48+
49+
self.grid[row_number][column_number] += 1
50+
51+
if not self.grid[row_number][column_number] > 9:
52+
return
53+
54+
seen.add(position)
55+
self._flash(row_number, column_number, seen)
56+
57+
def _flash(self, row_number: int, column_number: int, seen: set):
58+
self.flashes += 1
59+
self.grid[row_number][column_number] = 0
60+
61+
self._increase_octopus_energy(row_number, column_number - 1, seen)
62+
self._increase_octopus_energy(row_number, column_number + 1, seen)
63+
self._increase_octopus_energy(row_number - 1, column_number, seen)
64+
self._increase_octopus_energy(row_number + 1, column_number, seen)
65+
self._increase_octopus_energy(row_number - 1, column_number - 1, seen)
66+
self._increase_octopus_energy(row_number - 1, column_number + 1, seen)
67+
self._increase_octopus_energy(row_number + 1, column_number - 1, seen)
68+
self._increase_octopus_energy(row_number + 1, column_number + 1, seen)
69+
70+
def get_flashes_count(self):
71+
return self.flashes
72+
73+
74+
if __name__ == "__main__":
75+
main()

2021/11/puzzle2.py

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import os
2+
import sys
3+
import typing
4+
5+
6+
def main():
7+
with open(os.path.join(sys.path[0], 'input'), 'r') as input_file:
8+
print(puzzle2(input_file))
9+
10+
11+
def puzzle2(input_file: typing.TextIO):
12+
rows = []
13+
14+
for row in input_file:
15+
rows.append([int(number) for number in row.strip()])
16+
17+
grid = OctopusGrid(rows)
18+
19+
while not grid.sync():
20+
grid.apply_step()
21+
22+
return grid.get_steps_count()
23+
24+
25+
class OctopusGrid:
26+
grid: [[int]]
27+
flashes: int
28+
steps: int
29+
30+
def __init__(self, grid: [[int]]):
31+
self.grid = grid
32+
self.flashes = 0
33+
self.steps = 0
34+
35+
def apply_step(self):
36+
self.steps += 1
37+
seen = set()
38+
39+
for row_number in range(0, len(self.grid)):
40+
for column_number in range(0, len(self.grid[row_number])):
41+
self._increase_octopus_energy(row_number, column_number, seen)
42+
43+
def _increase_octopus_energy(self, row_number: int, column_number: int, seen: set):
44+
if row_number < 0 or row_number >= len(self.grid) or \
45+
column_number < 0 or column_number >= len(self.grid[row_number]):
46+
return
47+
48+
position = (row_number, column_number)
49+
if position in seen:
50+
return
51+
52+
self.grid[row_number][column_number] += 1
53+
54+
if not self.grid[row_number][column_number] > 9:
55+
return
56+
57+
seen.add(position)
58+
self._flash(row_number, column_number, seen)
59+
60+
def _flash(self, row_number: int, column_number: int, seen: set):
61+
self.flashes += 1
62+
self.grid[row_number][column_number] = 0
63+
64+
self._increase_octopus_energy(row_number, column_number - 1, seen)
65+
self._increase_octopus_energy(row_number, column_number + 1, seen)
66+
self._increase_octopus_energy(row_number - 1, column_number, seen)
67+
self._increase_octopus_energy(row_number + 1, column_number, seen)
68+
self._increase_octopus_energy(row_number - 1, column_number - 1, seen)
69+
self._increase_octopus_energy(row_number - 1, column_number + 1, seen)
70+
self._increase_octopus_energy(row_number + 1, column_number - 1, seen)
71+
self._increase_octopus_energy(row_number + 1, column_number + 1, seen)
72+
73+
def get_flashes_count(self) -> int:
74+
return self.flashes
75+
76+
def get_steps_count(self) -> int:
77+
return self.steps
78+
79+
def sync(self) -> bool:
80+
return sum([sum(row) for row in self.grid]) == 0
81+
82+
83+
if __name__ == "__main__":
84+
main()

2021/11/test_puzzle1.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import io
2+
import os
3+
import sys
4+
5+
import pytest
6+
from puzzle1 import puzzle1
7+
8+
9+
@pytest.mark.parametrize(
10+
"test_input,expected", [
11+
(
12+
"""5483143223
13+
2745854711
14+
5264556173
15+
6141336146
16+
6357385478
17+
4167524645
18+
2176841721
19+
6882881134
20+
4846848554
21+
5283751526""",
22+
1656
23+
)
24+
])
25+
def test_puzzle1_sample(test_input, expected):
26+
assert puzzle1(io.StringIO(test_input)) == expected
27+
28+
29+
@pytest.mark.parametrize(
30+
"test_input,expected", [
31+
(
32+
open(os.path.join(sys.path[0], 'input'), 'r'),
33+
1697
34+
)
35+
])
36+
def test_puzzle1(test_input, expected):
37+
assert puzzle1(test_input) == expected

2021/11/test_puzzle2.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import io
2+
import os
3+
import sys
4+
5+
import pytest
6+
from puzzle2 import puzzle2
7+
8+
9+
@pytest.mark.parametrize(
10+
"test_input,expected", [
11+
(
12+
"""5483143223
13+
2745854711
14+
5264556173
15+
6141336146
16+
6357385478
17+
4167524645
18+
2176841721
19+
6882881134
20+
4846848554
21+
5283751526""",
22+
195
23+
)
24+
])
25+
def test_puzzle2_sample(test_input, expected):
26+
assert puzzle2(io.StringIO(test_input)) == expected
27+
28+
29+
@pytest.mark.parametrize(
30+
"test_input,expected", [
31+
(
32+
open(os.path.join(sys.path[0], 'input'), 'r'),
33+
344
34+
)
35+
])
36+
def test_puzzle2(test_input, expected):
37+
assert puzzle2(test_input) == expected

0 commit comments

Comments
 (0)