AdventOfCode/Python/2021/09/day9.py

105 lines
2.6 KiB
Python
Raw Permalink Normal View History

2021-12-08 22:40:17 -08:00
from collections import deque as queue
import sys
import time
input = open("input.txt", 'r')
data = []
for line in input:
row = []
for character in line:
if character == '\n':
continue
row.append(int(character))
data.append(row)
def risk_level(point):
return 1 + point
def check_minimum(columnn, row, data):
value = data[row][columnn]
for i in range(row-1, (row+1)+1):
if i < 0 or i >= len(data):
continue
for j in range(column-1,(column+1)+1):
if j < 0 or j >= len(data[i]):
continue
if i == row and j == column:
continue
if data[i][j] <= value:
return False
return True
def is_valid(vis, row, col, data):
if row < 0 or col < 0 or row >= len(data) or col >= len(data[row]):
return False
if vis[row][col]:
return False
if data[row][col] >= 9:
return False
return True
dirRow = [-1, 0, 1, 0]
dirCol = [0, 1, 0, -1]
def update_vis(vis, row, column, value):
for i in vis:
for j in i:
if j:
sys.stdout.write("\N{ESC}[31m")
else:
sys.stdout.write("\N{ESC}[34m")
sys.stdout.write(str(int(j)))
sys.stdout.write("\n")
sys.stdout.flush()
time.sleep(0.1)
vis[row][column] = value
def calc_basin_size(row, column, data, vis):
q = queue()
q.append((row, column))
update_vis(vis, row, column, True)
while len(q) > 0:
location = q.popleft()
x = location[0]
y = location[1]
for i in range(4):
adj_x = x + dirRow[i]
adj_y = y + dirCol[i]
if is_valid(vis, adj_x, adj_y, data):
q.append((adj_x, adj_y))
update_vis(vis, adj_x, adj_y, True)
total = 0
for r in vis:
for c in r:
total += int(c)
return total
maximums = []
answer = 0
vis = [[False for i in range(len(data[0]))] for i in range(len(data))]
for row in range(0, len(data)):
previous = 10
for column in range(0, len(data[row])):
if previous > data[row][column]:
if check_minimum(column, row, data):
if vis[row][column]:
previous = data[row][column]
continue
# answer += risk_level(data[row][column])
size = calc_basin_size(row, column, data, vis)
maximums.append(size)
previous = data[row][column]
maximums.sort()
print(maximums[-1]*maximums[-2]*maximums[-3])