aoc2021/day17.py

47 lines
1.4 KiB
Python

from tools.aoc import AOCDay
from typing import Any
def fire(velX: int, velY: int, minX: int, maxX: int, minY: int, maxY: int) -> (bool, int):
highY, posX, posY = 0, velX, velY
while not posX > maxX and not posY < minY:
if velX > 0:
velX -= 1
elif posX < minX:
break
velY -= 1
posX += velX
posY += velY
if posY > highY:
highY = posY
hit = minX <= posX - velX <= maxX and minY <= posY - velY <= maxY
return hit, highY if hit else minY
class Day(AOCDay):
test_solutions_p1 = [45, 5151]
test_solutions_p2 = [112, 968]
def getBoundaries(self) -> (int, int, int, int):
_, ranges = self.getInput().split("=", 1)
xRange, yRange = ranges.split(", y=")
minX, maxX = map(int, xRange.split(".."))
minY, maxY = map(int, yRange.split(".."))
return minX, maxX, minY, maxY
def part1(self) -> Any:
minX, maxX, minY, maxY = self.getBoundaries()
return max(fire(x, y, minX, maxX, minY, maxY)[1] for x in range(maxX) for y in range(abs(minY)))
def part2(self) -> Any:
minX, maxX, minY, maxY = self.getBoundaries()
hitCounter = 0
for x in range(maxX + 1):
for y in range(minY, abs(minY)):
h, _ = fire(x, y, minX, maxX, minY, maxY)
hitCounter += h
return hitCounter