advent-of-code-2k21/day5/day5.py

42 lines
1.6 KiB
Python
Raw Permalink Normal View History

2021-12-06 21:44:17 +00:00
from collections import defaultdict
def main(infile):
points = defaultdict(int)
with open(infile) as f:
for line in f:
start, end = line.split(" -> ")
start_x, start_y = [int(x) for x in start.split(",")]
end_x, end_y = [int(x) for x in end.split(",")]
# column |
if start_x == end_x:
step = 1 if start_y < end_y else -1
for y in range(start_y, end_y + step, step):
points[(start_x, y)] = points[(start_x, y)] + 1
# line -
elif start_y == end_y:
step = 1 if start_x < end_x else -1
for x in range(start_x, end_x + step, step):
points[(x, start_y)] = points[(x, start_y)] + 1
# diagonal \
elif ((start_x < end_x and start_y > end_y)
or (start_x > end_x and start_y < end_y)):
step = 1 if start_y > end_y else -1
for dx in range(0, end_x - start_x + step, step):
points[(start_x + dx, start_y - dx)] = points[(start_x + dx, start_y + dx)] + 1
# diagonal /
elif ((start_x < end_x and start_y < end_y)
or (start_x > end_x and start_y > end_y)):
step = 1 if start_y < end_y else -1
for dx in range(0, end_x - start_x + step, step):
points[(start_x + dx, start_y + dx)] = points[(start_x + dx, start_y + dx)] + 1
res = len([x for x in points.values() if x >= 2])
print(res)
if __name__ == "__main__":
main("input.txt")