advent_of_code/5/5_2.py

136 lines
3.2 KiB
Python
Raw Normal View History

2021-12-07 03:04:38 +01:00
#!/usr/bin/env python
# 2021 - Advent Of Code - 5 part 2
def parse_file(file):
horizontal_lines = []
vertical_lines = []
diagonal_lines = []
with open(file) as f:
for l in f.readlines():
p1, p2 = l.strip().split(' -> ')
strx1, stry1 = p1.split(',')
strx2, stry2 = p2.split(',')
# filter horizontal and vertical lines only
p1 = (int(strx1), int(stry1))
p2 = (int(strx2), int(stry2))
if strx1 == strx2:
vertical_lines.append([p1, p2])
elif stry1 == stry2:
horizontal_lines.append([p1, p2])
else:
diagonal_lines.append([p1, p2])
return horizontal_lines, vertical_lines, diagonal_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
def draw_diagonal(g, dline):
x1 = dline[0][0]
y1 = dline[0][1]
x2 = dline[1][0]
y2 = dline[1][1]
hdir = 1
if x1 > x2:
hdir = -1
vdir = 1
if y1 > y2:
vdir = -1
lx = x1
ly = y1
2021-12-12 17:23:29 +01:00
for _ in range(abs(x2-x1)+1):
2021-12-07 03:04:38 +01:00
g[ly][lx] += 1
lx += hdir
ly += vdir
hlines, vlines, dlines = parse_file('input.txt')
print(f'horizontal lines parsed: {len(hlines)}')
print(f'vertical lines parsed: {len(vlines)}')
print(f'diagonal lines parsed: {len(dlines)}')
# detect size of the grid (assumed 1000x1000, but why not ;-) )
maxx = 0
maxy = 0
for line in hlines + vlines + dlines:
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)
for dl in dlines:
draw_diagonal(grid, dl)
# 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()