Solve 2021:11 "Dumbo Octopus"

This commit is contained in:
Anders Englöf Ytterström 2021-12-11 09:36:09 +01:00
parent 801f977e92
commit b53c50addc
2 changed files with 113 additions and 0 deletions

View file

@ -0,0 +1,66 @@
from solutions import BaseSolution
from collections import deque
class Solution(BaseSolution):
input_file = "11.txt"
def __str__(self):
return "Day 11: Dumbo Octopus"
def parse_input(self, data):
return [list(map(int, d)) for d in data.split()]
def solve(self, puzzle_input, steps=100):
flashes = self._tick(puzzle_input, steps, exit_on_bright=False)
return flashes
def solve_again(self, puzzle_input, steps=100):
brightest = self._tick(puzzle_input, steps, exit_on_bright=True)
return brightest
def _debug(self, d):
print("\n")
for r in d:
print("".join(map(str, r)))
def _tick(self, matrix, steps, exit_on_bright=False):
my = len(matrix)
mx = len(matrix[0])
offsets = [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)]
f = 0
# self._debug(matrix)
counter = 0
while 1:
if not exit_on_bright and not counter < steps:
break
if exit_on_bright:
if sum(sum(c for c in r) for r in matrix) == 0:
return counter
matrix = [[(c + 1) % 10 for c in r] for r in matrix]
flash = deque()
for y, r in enumerate(matrix):
for x, v in enumerate(r):
if v == 0:
flash.append((y, x))
while flash:
f += 1
y, x = flash.popleft()
for ay, ax in offsets:
oy, ox = y + ay, x + ax
if oy < 0 or ox < 0 or oy >= my or ox >= mx:
continue
v = matrix[oy][ox]
if v == 0:
continue
matrix[oy][ox] = (v + 1) % 10
if v == 9:
flash.append((oy, ox))
# self._debug(matrix)
counter += 1
return f
if __name__ == "__main__":
solution = Solution()
solution.show_results()

View file

@ -0,0 +1,47 @@
import unittest
from solutions.day_11 import Solution
class Day11TestCase(unittest.TestCase):
def setUp(self):
self.solution = Solution()
self.puzzle_input = self.solution.parse_input(
"""
5483143223
2745854711
5264556173
6141336146
6357385478
4167524645
2176841721
6882881134
4846848554
5283751526
"""
)
def test_parse_puzzle_input(self):
data = """
1234
5678
"""
assert self.solution.parse_input(data) == [[1, 2, 3, 4], [5, 6, 7, 8]]
def test_solve_first_part(self):
data = """
11111
19991
19191
19991
11111
"""
assert self.solution.solve(self.solution.parse_input(data), 2) == 9
assert self.solution.solve(self.puzzle_input) == 1656
def test_solve_second_part(self):
assert self.solution.solve_again(self.puzzle_input) == 195
if __name__ == "__main__":
unittest.main()