[py] Port 2018_10, kinda
This commit is contained in:
parent
15ab5575b2
commit
5378a7f680
3 changed files with 80 additions and 87 deletions
|
|
@ -1,86 +0,0 @@
|
|||
import re
|
||||
import sys
|
||||
|
||||
# PART 1
|
||||
|
||||
POINT_RE = r"position=<\s*(-?\d+),\s*(-?\d+)> velocity=<\s*(-?\d+),\s*(-?\d+)>\n"
|
||||
|
||||
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_file(cls, filename):
|
||||
points = []
|
||||
with open(filename, "r") as f:
|
||||
for line in f:
|
||||
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)
|
||||
|
||||
# PART 2
|
||||
|
||||
def main(filename):
|
||||
print(f"Solutions for {filename}")
|
||||
|
||||
print("Part 1:")
|
||||
field = Field.from_file(filename)
|
||||
field.step_until_in_limits()
|
||||
while input() == "":
|
||||
field.render()
|
||||
field.step()
|
||||
|
||||
print("Part 2: NYI")
|
||||
|
||||
if __name__ == "__main__":
|
||||
for filename in sys.argv[1:]:
|
||||
main(filename)
|
||||
|
|
@ -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
78
py/aoc/y2018/d10.py
Normal 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")
|
||||
Loading…
Add table
Add a link
Reference in a new issue