| @@ -0,0 +1,23 @@ | |||
| from toolkit import read_image | |||
| ans1 = 0 | |||
| grid = read_image(text)[0] | |||
| for p, v in grid.items(): | |||
| if all(grid[p + s] > v for s in [1, -1, 1j, -1j] if p + s in grid): | |||
| ans1 += int(v) + 1 | |||
| valid = {k for k, v in grid.items() if v != '9'} | |||
| pending = valid.copy() | |||
| basin_sizes = [] | |||
| while pending: | |||
| edge = {pending.pop()} | |||
| seen = edge.copy() | |||
| while edge: | |||
| edge = {p + s for p in edge for s in [1, -1, 1j, -1j]} & valid - seen | |||
| seen |= edge | |||
| pending -= seen | |||
| basin_sizes.append(len(seen)) | |||
| *_, x, y, z = sorted(basin_sizes) | |||
| ans2 = x * y * z | |||