91 lines
2.5 KiB
Python

""" https://adventofcode.com/2018/day/10 """
def readFile():
with open(f"{__file__.rstrip('code.py')}input.txt", "r") as f:
lines = f.readlines()
points = []
for line in lines:
points.append(Point(
int(line[10:16]), int(line[18:24]), # position
int(line[36:38]), int(line[40:42]) # velocity
))
return points
class Point:
def __init__(self, px, py, vx, vy):
self.px = px
self.py = py
self.vx = vx
self.vy = vy
def move(self, reverse = False):
if reverse:
self.px -= self.vx
self.py -= self.vy
else:
self.px += self.vx
self.py += self.vy
def getBorderSizeX(vals, getMin = False):
minimum, maximum = None, None
for point in vals:
if minimum is None or point.px < minimum:
minimum = point.px
if maximum is None or point.px > maximum:
maximum = point.px
if not getMin:
return maximum - minimum
else:
return maximum - minimum, minimum
def getBorderSizeY(vals, getMin = False):
minimum, maximum = None, None
for point in vals:
if minimum is None or point.py < minimum:
minimum = point.py
if maximum is None or point.py > maximum:
maximum = point.py
if not getMin:
return maximum - minimum
else:
return maximum - minimum, minimum
def solve(vals):
oldSizeX, oldSizeY = getBorderSizeX(vals), getBorderSizeY(vals)
cont = True
time = 0
while cont:
time += 1
for point in vals:
point.move()
sizeX, sizeY = getBorderSizeX(vals), getBorderSizeY(vals)
if sizeX < oldSizeX or sizeY < oldSizeY:
oldSizeX = sizeX
oldSizeY = sizeY
else:
cont = False
time -= 1
for point in vals:
point.move(reverse=True)
sizeX, minX = getBorderSizeX(vals, getMin=True)
sizeY, minY = getBorderSizeY(vals, getMin=True)
area = [["." for i in range(sizeX + 1)] for j in range(sizeY + 1)]
for point in vals:
area[point.py - minY][point.px - minX] = "#"
a = []
for j in range(sizeY + 1):
b = ["\n"]
for i in range(sizeX + 1):
b.append(area[j][i])
a.append(" ".join(b))
return "".join(a), time
if __name__ == "__main__":
vals = readFile()
part1, part2 = solve(vals)
print(f"Part 1: {part1}")
print(f"Part 2: {part2}")