import time valid_symbols = "#$%&*+-/=@"#"/,!@#$%^&*()_-+={}[]" w,h = (140,140) with open("input_day3.txt") as file: lines = [line.rstrip() for line in file] matrix = [[0 for x in range(w)] for y in range(h)] for y in range(h): for x in range(w): matrix[y][x] = lines[y][x] class number: def __init__(self,x,y,length=1,num=0): self.x = x self.y = y self.length = length self.number = num def append(self,num=0): self.length+=1 self.number = int( f"{self.number}{num}" ) def is_valid(num:number) -> bool: #but first check if number is valid result = False for offset in range(num.length): x = num.x+offset y = num.y check_upperleft = True check_upper = True check_upperright = True check_midleft = True check_midright = True check_lowerleft = True check_lower = True check_lowerright = True #if on first y dont check above if num.y == 0: check_upperleft,check_upper,check_upperright = (False,False,False) #if on last y dont check below if num.y == h-1: check_lowerleft,check_lower,check_lowerright = (False,False,False) # if on left or right horizontal edge if x == 0: check_midleft = False if x >= w-1: check_midright = False check_upperright = False check_lowerright = False #now do comparison if check_upperleft: if is_symbol(str(matrix[y-1][x-1])): return True if check_upper: if is_symbol(str(matrix[y-1][x])): return True if check_upperright: if is_symbol(str(matrix[y-1][x+1])): return True if check_midleft: if is_symbol(str(matrix[y][x-1])): return True if check_midright: if is_symbol(str(matrix[y][x+1])): return True if check_lowerleft: if is_symbol(str(matrix[y+1][x-1])): return True if check_lower: if is_symbol(str(matrix[y+1][x])): return True if check_lowerright: if is_symbol(str(matrix[y+1][x+1])): return True return False def is_symbol(c): if c in valid_symbols: return True return False numbers = [] #140x140 matrix y=-1 #look at every element in matrix for a number for line in lines: #start new line y+=1 is_on_number = False for x in range(w): c = line[x] if c.isnumeric(): if not is_on_number: #start a new number record is_on_number = True new_num = number(x,y,num=int(c)) elif x == w-1: new_num.append(c) if is_valid(new_num): numbers.append(new_num) print(new_num.number) is_on_number = False else: #append to existing number new_num.append(c) else: #not a number anymore so finish the number and add to num list if number is valid if is_on_number: if is_valid(new_num): numbers.append(new_num) #print(new_num.number) #time.sleep(0.1) is_on_number = False sum = 0 for num in numbers: sum+=int(num.number) print(sum)