from solutions import BaseSolution from solutions.day_10 import Solution as KnotHash class Solution(BaseSolution): input_file = "14.txt" def __str__(self): return "Day 14: Disk Defragmentation" def _get_grid(self, pi): grid = "" ks = KnotHash() for n in range(128): s = "-".join([pi, str(n)]) knothash = ks.solve_again(s) grid += "{:0128b}".format(int(knothash, 16)) return grid def _find_regions(self, squares): seen = set() regions = 0 def get_adjacent_square(i): if i in seen or i not in squares: return seen.add(i) if i % 128 > 0: get_adjacent_square(i - 1) if i > 127: get_adjacent_square(i - 128) if i % 128 < 127: get_adjacent_square(i + 1) if i < 128**2 - 128: get_adjacent_square(i + 128) for i in range(128**2): if i in seen or i not in squares: continue regions += 1 get_adjacent_square(i) return regions def solve(self, puzzle_input): grid = self._get_grid(puzzle_input) return sum(map(int, grid)) def solve_again(self, puzzle_input): grid = self._get_grid(puzzle_input) squares = [i for i, s in enumerate(list(grid)) if s == "1"] return self._find_regions(squares) if __name__ == "__main__": solution = Solution() solution.show_results()