summaryrefslogtreecommitdiffstats
path: root/13.py
diff options
context:
space:
mode:
Diffstat (limited to '13.py')
-rw-r--r--13.py41
1 files changed, 41 insertions, 0 deletions
diff --git a/13.py b/13.py
new file mode 100644
index 0000000..4003f9c
--- /dev/null
+++ b/13.py
@@ -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()