advent24-llm / day12 /solution_claude-3-5-sonnet-20241022.py
jerpint's picture
Add solution files
a4da721
raw
history blame
2.62 kB
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))