2024-12-12 22:53:34 +01:00
|
|
|
import re
|
|
|
|
|
from collections import Counter, defaultdict, deque
|
|
|
|
|
from heapq import heappop, heappush
|
|
|
|
|
from itertools import chain, combinations, compress, permutations
|
|
|
|
|
|
|
|
|
|
from output import ADJ, DD, D, ccw, cw, ints, matrix, mdbg, mhd, vdbg
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def solve(data):
|
|
|
|
|
grid, H, W = matrix(data)
|
|
|
|
|
p1 = 0
|
|
|
|
|
seen = set()
|
|
|
|
|
for r, row in enumerate(grid):
|
|
|
|
|
for c, col in enumerate(row):
|
|
|
|
|
if (r, c) in seen:
|
|
|
|
|
continue
|
|
|
|
|
areas = 0
|
|
|
|
|
perimeters = 0
|
|
|
|
|
q = deque([(r, c)])
|
|
|
|
|
while q:
|
|
|
|
|
rc = q.popleft()
|
|
|
|
|
if rc in seen:
|
|
|
|
|
continue
|
|
|
|
|
seen.add(rc)
|
|
|
|
|
areas += 1
|
|
|
|
|
y, x = rc
|
|
|
|
|
for dy, dx in D:
|
2024-12-13 15:15:05 +01:00
|
|
|
if (0 <= y + dy < H and 0 <= x + dx < W) and grid[y + dy][
|
|
|
|
|
x + dx
|
|
|
|
|
] == col:
|
2024-12-12 22:53:34 +01:00
|
|
|
q.append((y + dy, x + dx))
|
|
|
|
|
else:
|
|
|
|
|
perimeters += 1
|
2024-12-13 15:15:05 +01:00
|
|
|
p1 += areas * perimeters
|
2024-12-12 22:53:34 +01:00
|
|
|
p2 = None
|
|
|
|
|
return p1, p2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
import os
|
|
|
|
|
|
|
|
|
|
# use dummy data
|
|
|
|
|
inp = """
|
|
|
|
|
RRRRIICCFF
|
|
|
|
|
RRRRIICCCF
|
|
|
|
|
VVRRRCCFFF
|
|
|
|
|
VVRCCCJFFF
|
|
|
|
|
VVVVCJJCFE
|
|
|
|
|
VVIVCCJJEE
|
|
|
|
|
VVIIICJJEE
|
|
|
|
|
MIIIIIJJEE
|
|
|
|
|
MIIISIJEEE
|
|
|
|
|
MMMISSJEEE
|
|
|
|
|
""".strip()
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
A region of R plants with price 12 * 18 = 216.
|
|
|
|
|
A region of I plants with price 4 * 8 = 32.
|
|
|
|
|
A region of C plants with price 14 * 28 = 392.
|
|
|
|
|
A region of F plants with price 10 * 18 = 180.
|
|
|
|
|
A region of V plants with price 13 * 20 = 260.
|
|
|
|
|
A region of J plants with price 11 * 20 = 220.
|
|
|
|
|
A region of C plants with price 1 * 4 = 4.
|
|
|
|
|
A region of E plants with price 13 * 18 = 234.
|
|
|
|
|
A region of I plants with price 14 * 22 = 308.
|
|
|
|
|
A region of M plants with price 5 * 12 = 60.
|
|
|
|
|
A region of S plants with price 3 * 8 = 24.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
# uncomment to instead use stdin
|
|
|
|
|
# import sys; inp = sys.stdin.read().strip()
|
|
|
|
|
|
|
|
|
|
# uncomment to use AoC provided puzzle input
|
|
|
|
|
with open("./input/12.txt", "r") as f:
|
|
|
|
|
inp = f.read().strip()
|
|
|
|
|
|
|
|
|
|
# uncomment to do initial data processing shared by part 1-2
|
|
|
|
|
p1, p2 = solve(inp)
|
|
|
|
|
|
|
|
|
|
print(p1)
|
|
|
|
|
os.system(f"echo {p1} | wl-copy")
|
|
|
|
|
# print(p2)
|
|
|
|
|
# os.system(f"echo {p2} | wl-copy")
|
|
|
|
|
|
|
|
|
|
# uncomment and replace 0 with actual output to refactor code
|
|
|
|
|
# and ensure nonbreaking changes
|
|
|
|
|
assert p1 == 1446042
|
|
|
|
|
# assert p2 == 0
|