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))