Files
advent_of_code/2023/11/part 2 solution.py
T
2023-12-17 17:37:01 +00:00

113 lines
3.6 KiB
Python

from queue import Queue
# import os
with open(r'advent_of_code\2023\11\input.txt', 'r') as file:
input = file.readlines()
# print(input)
test_input = '''...#......
.......#..
#.........
..........
......#...
.#........
.........#
..........
.......#..
#...#.....'''
#print(test_input)
#input = test_input.split('\n')
def expand_universe(input):
'''add an extra row or column of empty spaces to each row or column that has no # in it'''
print('Expanding universe')
# expand empty rows
new_input = []
empty_rows = []
for i, row in enumerate(input):
if '#' in row:
new_input.append(row)
else:
new_input.append(row)
#new_input.append(row)
empty_rows.append(i)
# expand empty columns
empty_columns = []
# Transpose the input
transposed_input = list(map(list, zip(*new_input)))
new_input = []
for i, row in enumerate(transposed_input):
if '#' in row:
new_input.append(row)
else:
new_input.append(row)
#new_input.append(row)
empty_columns.append(i)
# Convert rows back to strings
new_input = [''.join(row) for row in new_input]
return new_input, empty_rows, empty_columns
def number_galaxies(input):
'''gives a unique number to each galaxy(#) in the input grid'''
print('Numbering galaxies')
# make a copy of the input
input_copy = [list(row) for row in input] # Convert strings to lists
# replace the galaxies with their numbers
galaxy_coordinates = [] # This list will store the coordinates of each galaxy
for i in range(len(input_copy)):
for j in range(len(input_copy[i])):
if input_copy[i][j] == '#':
galaxy_coordinates.append((i, j)) # Store the coordinates of the galaxy
# Convert lists back to strings
input_copy = [''.join(map(str, row)) for row in input_copy]
return input_copy, galaxy_coordinates
def calculate_distance(point1, point2, empty_rows, empty_columns):
# Calculate Manhattan distance
total_distance = abs(point1[0] - point2[0]) + abs(point1[1] - point2[1])
length_to_add = 1000000-1 # The additional length to add when passing through an empty row or column
# Check each empty row
for row in empty_rows:
if min(point1[1], point2[1]) <= row <= max(point1[1], point2[1]):
total_distance += length_to_add
# Check each empty column
for column in empty_columns:
if min(point1[0], point2[0]) <= column <= max(point1[0], point2[0]):
total_distance += length_to_add
return total_distance
def find_shortest_path(galaxy_coordinates, empty_rows, empty_columns):
# find the shortest path between each pair of galaxies
print('Finding the shortest path between each pair of galaxies')
galaxy_distances = []
for i, point1 in enumerate(galaxy_coordinates):
for point2 in galaxy_coordinates[:i]:
distance = calculate_distance(point1, point2, empty_rows, empty_columns)
galaxy_distances.append(distance)
return galaxy_distances
def sum_up_distances(galaxy_distances):
# sum up all the distances
print('Summing up all the distances')
total_distance = 0
for distance in galaxy_distances:
total_distance += distance
return total_distance
input,empty_rows,empty_columns = expand_universe(input)
input, galaxy_coordinates = number_galaxies(input)
galaxy_distances = find_shortest_path(galaxy_coordinates, empty_rows, empty_columns)
total_distance = sum_up_distances(galaxy_distances)
print(total_distance)