new structure for 2018, added license information
This commit is contained in:
91
2018/10/code.py
Normal file
91
2018/10/code.py
Normal file
@ -0,0 +1,91 @@
|
||||
""" 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}")
|
Reference in New Issue
Block a user