diff options
Diffstat (limited to '13.py')
-rw-r--r-- | 13.py | 41 |
1 files changed, 41 insertions, 0 deletions
@@ -0,0 +1,41 @@ +from utils import open_day +from dataclasses import dataclass + +@dataclass +class Point: + x: int + y: int + @staticmethod + def from_str(s: str) -> 'Point': + return Point(*map(int, s.split(',', maxsplit=1))) + +@dataclass +class Fold: + axis: str + pos: int + @staticmethod + def from_str(s: str) -> 'Fold': + axis, pos = s.split(' ')[2].split('=', maxsplit=1) + return Fold(axis, int(pos)) + +with open_day(13) as f: + parts = f.read().rstrip().split('\n\n') + points = [Point.from_str(l) for l in parts[0].split('\n')] + folds = [Fold.from_str(l) for l in parts[1].split('\n')] + +def fold(points: list[Point], fold: Fold): + for i in range(len(points)): + point_pos = getattr(points[i], fold.axis) + if point_pos > fold.pos: + setattr(points[i], fold.axis, 2 * fold.pos - point_pos) + +for i, f in enumerate(folds): + fold(points, f) + if i == 0: print(len(set((p.x, p.y) for p in points))) +maxx = min(f.pos for f in folds if f.axis == 'x') +maxy = min(f.pos for f in folds if f.axis == 'y') +points = set((p.x, p.y) for p in points) +for y in range(maxy): + for x in range(maxx): + print('#' if (x, y) in points else '.', end='') + print() |