parent
76ed46fe11
commit
4eae307bee
3 changed files with 44 additions and 0 deletions
@ -0,0 +1,42 @@ |
|||||||
|
import math |
||||||
|
import re |
||||||
|
|
||||||
|
with open("input") as file: |
||||||
|
target = file.read().removesuffix("\n") |
||||||
|
minX, maxX, minY, maxY = [int(v) for v in re.search(r"x=(.+)\.\.(.+), y=(.+)\.\.(.+)", target).groups()] |
||||||
|
|
||||||
|
# minimize the set of velocities to check via bounds |
||||||
|
# lower x bound cant be lower than a |
||||||
|
# where a(a+1)/2 = minX (little gauss) |
||||||
|
# because posX loses 1 every step and posX must at least reach minX |
||||||
|
# isolating a gives -0.5 + sqrt(0.25 + 2 * minX) |
||||||
|
# ceiling is enough because if minX gets a bit higher then a cannot reach it anymore |
||||||
|
xBounds = math.ceil(-0.5 + math.sqrt(0.25 + 2 * minX)), maxX |
||||||
|
|
||||||
|
# yPos is symmetric on the way back down and starts with 0 |
||||||
|
yBounds = minY, -minY |
||||||
|
|
||||||
|
xRange = range(xBounds[0], xBounds[1] + 1) |
||||||
|
yRange = range(yBounds[0], yBounds[1] + 1) |
||||||
|
|
||||||
|
validCount = 0 |
||||||
|
allMaxYReached = [] |
||||||
|
|
||||||
|
# simulate all possible velocities |
||||||
|
for vx, vy in [(x, y) for x in xRange for y in yRange]: |
||||||
|
posX, posY = 0, 0 |
||||||
|
maxYReached = 0 |
||||||
|
while posX <= maxX and posY >= minY: |
||||||
|
if posX >= minX and posY <= maxY: |
||||||
|
# target hit |
||||||
|
validCount += 1 |
||||||
|
allMaxYReached.append(maxYReached) |
||||||
|
break |
||||||
|
posX += vx |
||||||
|
posY += vy |
||||||
|
vx -= 1 if vx > 0 else 0 |
||||||
|
vy -= 1 |
||||||
|
maxYReached = max(posY, maxYReached) |
||||||
|
|
||||||
|
print(max(allMaxYReached)) |
||||||
|
print(validCount) |
@ -0,0 +1 @@ |
|||||||
|
target area: x=20..30, y=-10..-5 |
Loading…
Reference in new issue