data = [] low_points = [] with open('data', 'r') as fp: # NOTE(dev): We assume all lines are the same length for line in fp: data_line = [] for ch in line.strip(): data_line.append(int(ch)) data.append(data_line) total = 0 for y in range(0, len(data)): for x in range(0, len(data[y])): sub_total = 0 all_four = 0 # above if(y > 0): if(data[y-1][x] > data[y][x]): all_four += 1 else: all_four += 1 # skip # below if(y < len(data) - 1): if(data[y+1][x] > data[y][x]): all_four += 1 else: all_four += 1 #skip # left if(x > 0): if(data[y][x-1] > data[y][x]): all_four += 1 else: all_four += 1 #skip # right if(x < len(data[y]) - 1): if(data[y][x+1] > data[y][x]): all_four += 1 else: all_four += 1 #skip if(all_four == 4): total += data[y][x] + 1 low_points.append(tuple([y,x])) print('Part 1:', total) bin_sizes = [] for point in low_points: points_to_check = [point] checked_points = [] while len(points_to_check): p = points_to_check.pop() checked_points.append(p) cur_y = p[0] cur_x = p[1] # check left if(cur_x > 0): if(data[cur_y][cur_x - 1] < 9): left = tuple([cur_y, cur_x - 1]) if(not (left in checked_points) and not (left in points_to_check)): points_to_check.append(left) # check right if(cur_x < len(data[0]) - 1): if(data[cur_y][cur_x + 1] < 9): right = tuple([cur_y, cur_x + 1]) if(not (right in checked_points) and not (right in points_to_check)): points_to_check.append(right) # check above if(cur_y > 0): if(data[cur_y - 1][cur_x] < 9): above = tuple([cur_y - 1, cur_x]) if(not (above in checked_points) and not (above in points_to_check)): points_to_check.append(above) # check below if(cur_y < len(data) - 1): if(data[cur_y + 1][cur_x] < 9): below = tuple([cur_y + 1, cur_x]) if(not (below in checked_points) and not (below in points_to_check)): points_to_check.append(below) bin_sizes.append(len(checked_points)) bin_sizes.sort() total = 1 for i in range(len(bin_sizes) - 1, len(bin_sizes) - 4, -1): total *= bin_sizes[i] print(total)