You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.8 KiB
51 lines
1.8 KiB
lines = open("inputs/day11.txt").readlines()
|
|
|
|
def mkmat(lines):
|
|
mat = [[0 if x == "." else 1 for x in line.strip("\n")] for line in lines]
|
|
return mat
|
|
|
|
def empty_spaces(mat):
|
|
empty_lines = []
|
|
for idx, line in enumerate(mat):
|
|
if sum(line) == 0:
|
|
empty_lines.append(idx)
|
|
empty_cols = []
|
|
for i in range(len(mat[0])):
|
|
col = [x[i] for x in mat]
|
|
if sum(col) == 0:
|
|
empty_cols.append(i)
|
|
return empty_lines, empty_cols
|
|
|
|
def galaxies(mat):
|
|
coords = []
|
|
for idx, line in enumerate(mat):
|
|
for jdx, p in enumerate(line):
|
|
if p == 1:
|
|
coords.append((idx, jdx))
|
|
return coords
|
|
|
|
def manhattendistances(coords, expansions, expansionrate=1000000-1):
|
|
(rows, cols) = expansion
|
|
dists = [[0 for x in range(len(coords))] for y in range(len(coords))]
|
|
for i, coord1 in enumerate(coords):
|
|
for j, coord2 in enumerate(coords):
|
|
emptyrows = len([x for x in range(coord1[0], coord2[0]+1) if x in rows]) + len([x for x in range(coord1[0], coord2[0]+1)[::-1] if x in rows])
|
|
emptycols = len([x for x in range(coord1[1], coord2[1]+1) if x in cols]) + len([x for x in range(coord1[1], coord2[1]+1)[::-1] if x in cols])
|
|
d = manhatten(coord1, coord2) + ((emptyrows+emptycols) * expansionrate)
|
|
dists[i][j] = d
|
|
return dists
|
|
|
|
def manhatten(x,d):
|
|
(x,y) = x
|
|
(dx, dy) = d
|
|
return abs(x-dx) + abs(y-dy)
|
|
|
|
|
|
mat = mkmat(lines)
|
|
expansion = empty_spaces(mat)
|
|
coords = galaxies(mat)
|
|
dists = manhattendistances(coords, expansion)
|
|
|
|
print(f"Solution for Part 1: {sum([sum(i) for i in zip(*manhattendistances(coords, expansion, 1))])//2}")
|
|
print(f"Solution for Part 1: {sum([sum(i) for i in zip(*manhattendistances(coords, expansion, 1000000-1))])//2}")
|