Spaces:
Running
Running
| def find_regions(grid): | |
| height = len(grid) | |
| width = len(grid[0]) | |
| visited = set() | |
| regions = [] | |
| def flood_fill(x, y, char): | |
| if (x, y) in visited or x < 0 or y < 0 or x >= height or y >= width or grid[x][y] != char: | |
| return set() | |
| region = {(x, y)} | |
| visited.add((x, y)) | |
| # Check all four directions | |
| for dx, dy in [(0, 1), (1, 0), (0, -1), (-1, 0)]: | |
| new_x, new_y = x + dx, y + dy | |
| region.update(flood_fill(new_x, new_y, char)) | |
| return region | |
| for i in range(height): | |
| for j in range(width): | |
| if (i, j) not in visited: | |
| region = flood_fill(i, j, grid[i][j]) | |
| if region: | |
| regions.append((grid[i][j], region)) | |
| return regions | |
| def calculate_perimeter(region_cells, grid_height, grid_width): | |
| perimeter = 0 | |
| for x, y in region_cells: | |
| # Check all four sides | |
| for dx, dy in [(0, 1), (1, 0), (0, -1), (-1, 0)]: | |
| new_x, new_y = x + dx, y + dy | |
| if (new_x, new_y) not in region_cells: | |
| if new_x < 0 or new_y < 0 or new_x >= grid_height or new_y >= grid_width: | |
| perimeter += 1 | |
| elif (new_x, new_y) not in region_cells: | |
| perimeter += 1 | |
| return perimeter | |
| def count_sides(region_cells, grid_height, grid_width): | |
| edges = set() | |
| for x, y in region_cells: | |
| for dx, dy in [(0, 1), (1, 0), (0, -1), (-1, 0)]: | |
| new_x, new_y = x + dx, y + dy | |
| if (new_x, new_y) not in region_cells: | |
| # Store the edge as a tuple of two points to make it unique | |
| edge = tuple(sorted([(x, y), (x + dx/2, y + dy/2)])) | |
| edges.add(edge) | |
| return len(edges) | |
| def solve_part1(grid): | |
| regions = find_regions(grid) | |
| total_price = 0 | |
| height, width = len(grid), len(grid[0]) | |
| for char, region in regions: | |
| area = len(region) | |
| perimeter = calculate_perimeter(region, height, width) | |
| total_price += area * perimeter | |
| return str(total_price) | |
| def solve_part2(grid): | |
| regions = find_regions(grid) | |
| total_price = 0 | |
| height, width = len(grid), len(grid[0]) | |
| for char, region in regions: | |
| area = len(region) | |
| sides = count_sides(region, height, width) | |
| total_price += area * sides | |
| return str(total_price) | |
| # Read input | |
| with open('./input.txt', 'r') as file: | |
| grid = [list(line.strip()) for line in file] | |
| # Print results | |
| print(solve_part1(grid)) | |
| print(solve_part2(grid)) |