34 lines
1.2 KiB
Python
34 lines
1.2 KiB
Python
with open("/home/bandeira/git.bandeira/aoc/2024/day12/input.day12", "r") as file:
|
|
lines = file.read().strip().split("\n")
|
|
n, m = len(lines), len(lines[0])
|
|
graph = {i + j * 1j: c for i, r in enumerate(lines) for j, c in enumerate(r)}
|
|
for i in range(-1, n + 1):
|
|
graph[i - 1 * 1j] = graph[i + m * 1j] = "#"
|
|
for j in range(-1, m + 1):
|
|
graph[-1 + j * 1j] = graph[n + j * 1j] = "#"
|
|
visited = set()
|
|
|
|
|
|
def dfs(visited, node, color, dir):
|
|
if graph[node] != color:
|
|
if graph[node + dir * 1j] == color or graph[node - dir + dir * 1j] != color:
|
|
return 0, 1, 1
|
|
else:
|
|
return 0, 1, 0
|
|
if node in visited:
|
|
return 0, 0, 0
|
|
visited.add(node)
|
|
area, perimeter, sides = 1, 0, 0
|
|
for d in (1, -1, 1j, -1j):
|
|
a, p, s = dfs(visited, node + d, color, d)
|
|
area, perimeter, sides = area + a, perimeter + p, sides + s
|
|
return area, perimeter, sides
|
|
|
|
|
|
ans1, ans2 = 0, 0
|
|
for node in graph:
|
|
if node not in visited and graph[node] != "#":
|
|
area, perimeter, sides = dfs(visited, node, graph[node], 1)
|
|
ans1 += area * perimeter
|
|
ans2 += area * sides
|
|
print(ans1, ans2) |