advent24-llm / day12 /solution_gemini-1.5-pro.py
jerpint's picture
Add solution files
a4da721
from collections import defaultdict
def solve():
file = "input.txt"
grid = []
with open(file, 'r') as f:
for line in f:
grid.append(line.strip())
rows = len(grid)
cols = len(grid[0])
def get_neighbors(r, c):
neighbors = []
for dr, dc in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
nr, nc = r + dr, c + dc
if 0 <= nr < rows and 0 <= nc < cols:
neighbors.append((nr, nc))
return neighbors
def bfs(r, c, char):
q = [(r, c)]
visited = set([(r, c)])
area = 0
perimeter = 0
while q:
cr, cc = q.pop(0)
area += 1
for nr, nc in get_neighbors(cr, cc):
if (nr, nc) not in visited:
if grid[nr][nc] == char:
visited.add((nr, nc))
q.append((nr, nc))
else:
perimeter += 1
return area, perimeter
def bfs2(r, c, char):
q = [(r, c)]
visited = set([(r, c)])
area = 0
sides = 0
while q:
cr, cc = q.pop(0)
area += 1
ns = 0
for nr, nc in get_neighbors(cr, cc):
if grid[nr][nc] != char:
ns +=1
sides += ns
for nr, nc in get_neighbors(cr, cc):
if (nr, nc) not in visited and grid[nr][nc] == char:
visited.add((nr, nc))
q.append((nr, nc))
return area, sides
total_price = 0
visited = set()
for r in range(rows):
for c in range(cols):
if (r, c) not in visited:
char = grid[r][c]
area, perimeter = bfs(r, c, char)
total_price += area * perimeter
for rr, cc in bfs(r,c, char)[2]:
visited.add((rr,cc))
print(total_price)
total_price2 = 0
visited = set()
for r in range(rows):
for c in range(cols):
if (r, c) not in visited:
char = grid[r][c]
area, sides = bfs2(r, c, char)
total_price2 += area * sides
for rr, cc in bfs(r,c, char)[2]:
visited.add((rr,cc))
print(total_price2)
solve()