diff --git a/2021-python/solutions/day_11.py b/2021-python/solutions/day_11.py new file mode 100644 index 0000000..1ed2d50 --- /dev/null +++ b/2021-python/solutions/day_11.py @@ -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() diff --git a/2021-python/tests/test_day_11.py b/2021-python/tests/test_day_11.py new file mode 100644 index 0000000..6c816e2 --- /dev/null +++ b/2021-python/tests/test_day_11.py @@ -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()