[py] Port 2018_10, kinda

This commit is contained in:
Joscha 2022-12-06 15:42:13 +01:00
parent 15ab5575b2
commit 5378a7f680
3 changed files with 80 additions and 87 deletions

View file

@ -2,7 +2,7 @@ import sys
import argparse
from pathlib import Path
from .y2018 import d01, d02, d03, d04, d05, d06, d07, d08, d09
from .y2018 import d01, d02, d03, d04, d05, d06, d07, d08, d09, d10
from .y2020 import d10
from .y2021 import d14
from .y2022 import d01, d02, d03, d04, d05, d06
@ -17,6 +17,7 @@ DAYS = {
"2018_07": y2018.d07.solve,
"2018_08": y2018.d08.solve,
"2018_09": y2018.d09.solve,
"2018_10": y2018.d10.solve,
"2020_10": y2020.d10.solve,
"2021_14": y2021.d14.solve,
"2022_01": y2022.d01.solve,

78
py/aoc/y2018/d10.py Normal file
View file

@ -0,0 +1,78 @@
import re
POINT_RE = r"position=<\s*(-?\d+),\s*(-?\d+)> velocity=<\s*(-?\d+),\s*(-?\d+)>"
class Point:
def __init__(self, pos, vel):
self.pos = pos
self.vel = vel
@classmethod
def from_line(cls, line):
match = re.fullmatch(POINT_RE, line)
x, y, dx, dy = map(int, match.groups())
return cls((x, y), (dx, dy))
def step(self):
x, y = self.pos
dx, dy = self.vel
self.pos = (x + dx, y + dy)
class Field:
def __init__(self, points=None):
self.points = points or []
self.steps = 0
@classmethod
def from_str(cls, string):
points = []
for line in string.splitlines():
points.append(Point.from_line(line))
return cls(points=points)
def step(self):
for point in self.points:
point.step()
self.steps += 1
def step_until_in_limits(self):
while True:
coords = set(point.pos for point in self.points)
xs = set(x for (x, _) in coords)
ys = set(y for (_, y) in coords)
if max(xs) - min(xs) < 500:
return
self.step()
print(min(xs), max(xs), min(ys), max(ys))
def render(self):
coords = set(point.pos for point in self.points)
xs = set(x for (x, _) in coords)
ys = set(y for (_, y) in coords)
for y in range(min(ys), max(ys) + 1):
for x in range(min(xs), max(xs) + 1):
if (x, y) in coords:
print("#", end="")
else:
print(".", end="")
print()
print(self.steps)
def solve(inputstr):
print("Part 1:")
field = Field.from_str(inputstr)
field.step_until_in_limits()
while input() == "":
field.render()
field.step()
print("Part 2: NYI")