84 lines
2.6 KiB
Python
84 lines
2.6 KiB
Python
def read_grid(file_path):
|
|
"""Reads the grid from a file and returns it as a 2D list."""
|
|
try:
|
|
with open(file_path, 'r') as file:
|
|
grid = [list(line.strip()) for line in file]
|
|
return grid
|
|
except Exception as e:
|
|
print(f"Error reading file {file_path}: {e}")
|
|
raise
|
|
|
|
def move_rocks_north(grid):
|
|
"""Moves all rounded rocks 'O' north as far as possible."""
|
|
rows = len(grid)
|
|
cols = len(grid[0])
|
|
|
|
for col in range(cols):
|
|
for row in range(1, rows): # Start from second row
|
|
if grid[row][col] == 'O':
|
|
target_row = row
|
|
while target_row > 0 and grid[target_row-1][col] == '.':
|
|
target_row -= 1
|
|
if target_row != row:
|
|
grid[target_row][col], grid[row][col] = grid[row][col], grid[target_row][col]
|
|
|
|
def calculate_load(grid):
|
|
"""Calculates the total load on the north support beams."""
|
|
rows = len(grid)
|
|
total_load = 0
|
|
|
|
for row in range(rows):
|
|
for cell in grid[row]:
|
|
if cell == 'O':
|
|
total_load += (rows - row)
|
|
|
|
return total_load
|
|
|
|
def run_simulation(file_path):
|
|
"""Runs the rock-moving simulation and returns the total load."""
|
|
try:
|
|
grid = read_grid(file_path)
|
|
print(f"Initial Grid from {file_path}:")
|
|
for row in grid:
|
|
print(''.join(row))
|
|
|
|
move_rocks_north(grid)
|
|
|
|
print(f"Grid after moving rocks north from {file_path}:")
|
|
for row in grid:
|
|
print(''.join(row))
|
|
|
|
total_load = calculate_load(grid)
|
|
return total_load
|
|
except Exception as e:
|
|
print(f"Error during simulation for file {file_path}: {e}")
|
|
raise
|
|
|
|
def test_simulation():
|
|
"""Runs test simulation and asserts the expected output."""
|
|
test_file = "../test.txt"
|
|
expected_load = 136 # Expected load from the test case
|
|
|
|
print("Running test simulation...")
|
|
actual_load = run_simulation(test_file)
|
|
print(f"Test simulation load: {actual_load}")
|
|
|
|
assert actual_load == expected_load, f"Test failed: expected {expected_load}, got {actual_load}"
|
|
print("Test passed successfully.")
|
|
|
|
def main():
|
|
"""Main function to run the test and then the actual simulation."""
|
|
try:
|
|
test_simulation()
|
|
|
|
input_file = "../input.txt"
|
|
print("\nRunning actual simulation...")
|
|
total_load = run_simulation(input_file)
|
|
print(f"Total load from actual simulation: {total_load}")
|
|
except Exception as e:
|
|
print(f"Error in main function: {e}")
|
|
|
|
# Run the main function
|
|
if __name__ == "__main__":
|
|
main()
|