aoc2018/day10.py
2023-09-17 04:06:35 +02:00

71 lines
2.0 KiB
Python

from tools.aoc import AOCDay
from typing import Any
from tools.coordinate import Coordinate
from tools.grid import Grid
def simulate(starfield: Grid, print_grid: bool = True) -> int:
minSteps = 1e9
for pos in starfield.getActiveCells():
vec = starfield.get(pos)[0]
min_x_steps = abs(pos.x // vec.x) - 10
min_y_stepd = abs(pos.y // vec.y) - 10
minSteps = min(minSteps, min_x_steps, min_y_stepd)
new_starfield = Grid()
for pos in starfield.getActiveCells():
new_starfield.set(pos + starfield.get(pos)[0] * minSteps, starfield.get(pos))
starfield = new_starfield
for i in range(20000):
new_starfield = Grid()
for pos in starfield.getActiveCells():
for vec in starfield.get(pos):
target = pos + vec
if new_starfield.get(target):
new_starfield.get(target).append(vec)
else:
new_starfield.set(target, [vec])
starfield = new_starfield
if starfield.maxY - starfield.minY == 9:
if print_grid:
starfield.print(bool_mode=True)
return i + 1 + minSteps
class Day(AOCDay):
inputs = [
[
("BFFZCNXE", "input10"),
],
[
(10391, "input10"),
]
]
def getInputGrid(self) -> Grid:
grid = Grid()
for line in self.getInput():
(pos_str, vel_str) = line.split("> ")
(pos_x, pos_y) = map(int, pos_str.split("<")[1].split(","))
(vel_x, vel_y) = map(int, vel_str[:-1].split("<")[1].split(","))
grid.set(Coordinate(pos_x, pos_y), [Coordinate(vel_x, vel_y)])
return grid
def part1(self) -> Any:
starfield = self.getInputGrid()
simulate(starfield)
return "BFFZCNXE"
def part2(self) -> Any:
starfield = self.getInputGrid()
return simulate(starfield, print_grid=False)
if __name__ == '__main__':
day = Day(2018, 10)
day.run(verbose=True)