from tools.aoc import AOCDay from tools.coordinate import Coordinate from tools.grid import Grid from typing import Any, List def buildGrid(coords: List[str]) -> Grid: grid = Grid(0) for c in coords: 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 grid.getActiveCells(y=y): grid.add(Coordinate(x.x, targetY), grid.get(x)) grid.set(x, 0) grid.maxY = axis - 1 elif direction == "x": for x in range(axis + 1, grid.maxX + 1): targetX = axis - (x - axis) for y in grid.getActiveCells(x=x): grid.add(Coordinate(targetX, y.y), grid.get(y)) grid.set(y, 0) grid.maxX = axis - 1 class Day(AOCDay): inputs = [ [ (17, "test_input13"), (701, "input13") ], [ ("FPEKBEJL", "input13") ] ] def part1(self) -> Any: coords, folds = self.getMultiLineInputAsArray() grid = buildGrid(coords) fold_1 = folds[0] direction, axis = fold_1.split()[-1].split("=") fold(grid, direction, int(axis)) return len(grid.getActiveCells()) def part2(self) -> Any: coords, folds = self.getMultiLineInputAsArray() grid = buildGrid(coords) for thisFold in folds: direction, axis = thisFold.split()[-1].split("=") fold(grid, direction, int(axis)) return grid.get_aoc_ocr_string() if __name__ == '__main__': day = Day(2021, 13) day.run(verbose=True)