from tools.aoc import AOCDay from typing import Any from tools.coordinate import Coordinate from tools.grid import Grid def buildGrid(coords: str) -> Grid: grid = Grid(0) for c in coords.split(";"): x, y = map(int, c.split(",")) grid.set(Coordinate(x, y), 1) return grid def fold(grid: Grid, direction: str, axis: int): if direction == "y": for y in range(axis + 1, grid.maxY + 1): targetY = axis - (y - axis) for x in range(grid.minX, grid.maxX + 1): grid.add(Coordinate(x, targetY), grid.get(Coordinate(x, y))) grid.maxY = axis - 1 elif direction == "x": for x in range(axis + 1, grid.maxX + 1): targetX = axis - (x - axis) for y in range(grid.minY, grid.maxY + 1): grid.add(Coordinate(targetX, y), grid.get(Coordinate(x, y))) grid.maxX = axis - 1 class Day(AOCDay): test_solutions_p1 = [17, 701] test_solutions_p2 = [] def part1(self) -> Any: coords, folds = self.getMultiLineInputAsArray(join_char=";") grid = buildGrid(coords) fold_1 = folds.split(";")[0] direction, axis = fold_1.split()[-1].split("=") fold(grid, direction, int(axis)) onCount = 0 for x in range(grid.minX, grid.maxX + 1): for y in range(grid.minY, grid.maxY + 1): onCount += grid.get(Coordinate(x, y)) > 0 return onCount def part2(self) -> Any: coords, folds = self.getMultiLineInputAsArray(join_char=";") grid = buildGrid(coords) for thisFold in folds.split(";"): direction, axis = thisFold.split()[-1].split("=") fold(grid, direction, int(axis)) grid.print(true_char='#') return "see image above"