advent_of_code/5/5.py

109 lines
2.8 KiB
Python
Raw Normal View History

2021-12-07 02:30:14 +01:00
#!/usr/bin/env python
# 2021 - Advent Of Code - 5
def parse_file(file):
horizontal_lines = []
vertical_lines = []
2022-04-05 13:27:24 +02:00
with open(file, encoding="utf-8") as f:
2021-12-07 02:30:14 +01:00
for l in f.readlines():
p1, p2 = l.strip().split(' -> ')
strx1, stry1 = p1.split(',')
strx2, stry2 = p2.split(',')
# filter horizontal and vertical lines only
if strx1 == strx2:
p1 = (int(strx1), int(stry1))
p2 = (int(strx2), int(stry2))
vertical_lines.append([p1, p2])
if stry1 == stry2:
p1 = (int(strx1), int(stry1))
p2 = (int(strx2), int(stry2))
horizontal_lines.append([p1, p2])
return horizontal_lines, vertical_lines
def draw_horizontal(g, hline):
# print(f'drawing hline: {hline}')
if hline[0][0] < hline[1][0]: # left -> right
start_point = hline[0]
end_point = hline[1]
else:
start_point = hline[1]
end_point = hline[0]
ly = start_point[1]
# print(f'drawing from {start_point[0]} to {end_point[0]}')
for lx in range(start_point[0], end_point[0]+1):
g[ly][lx] += 1
def draw_vertical(g, vline):
# print(f'drawing vline: {vline}')
if vline[0][1] < vline[1][1]: # up -> down
start_point = vline[0]
end_point = vline[1]
else:
start_point = vline[1]
end_point = vline[0]
lx = start_point[0]
# print(f'drawing from {start_point[0]} to {end_point[0]}')
for ly in range(start_point[1], end_point[1]+1):
g[ly][lx] += 1
hlines, vlines = parse_file('input.txt')
print(f'horizontal lines parsed: {len(hlines)}')
print(f'vertical lines parsed: {len(vlines)}')
# detect size of the grid (assumed 1000x1000, but why not ;-) )
maxx = 0
maxy = 0
for line in hlines + vlines:
startp = line[0]
endp = line[1]
if startp[0] > maxx:
maxx = startp[0]
if endp[0] > maxx:
maxx = endp[0]
if startp[1] > maxy:
maxy = startp[1]
if endp[1] > maxy:
maxy = endp[1]
print(f'detected grid size: {maxx} x {maxy}')
grid = [[0] * (maxx+1) for _ in range(maxy+1)]
# draw
for hl in hlines:
draw_horizontal(grid, hl)
for vl in vlines:
draw_vertical(grid, vl)
# count points
points = 0
for y in range(maxy+1):
for x in range(maxx+1):
if grid[y][x] > 1:
points += 1
print(f'There\'s {points} points with at least two lines')
# bonus (or debug with the sample), draw the grid
# print(' ', end='')
# for y in range(maxy+1):
# print(y, end='')
# print()
#
# for y in range(maxy+1):
# print(f'{y} ', end='')
# for x in range(maxx+1):
# if grid[y][x] == 0:
# print('.', end='')
# else:
# print(str(grid[y][x]), end='')
# print()