import matrix import shared import itertools import functools SYMBOLS="*%@#+-/$=&" def get_all_numbers_and_starting_coords(mat): nums = [] for y, row in enumerate(mat): x = 0 while x < len(row): num = matrix.number_starting_at(mat, x,y) if num is None: x += 1 continue nums.append(((x,y), num)) x += len(num) return nums def get_row_coords(x1,y, length): coords = [] for x in range(x1, x1+length): coords.append((x,y)) return coords # @shared.profile def part1(mat): choose = [] nums = get_all_numbers_and_starting_coords(mat) for coords, num in nums: valid = process_number(mat, coords, num) if valid: choose.append(num) total = 0 for n in choose: total += int(n) print(total) def process_number(mx, coords, num): line_coords = get_row_coords(*coords, len(num)) for coord in line_coords: any_symbols = [v for _,v in matrix.get_neighbor_coords(mx, *coord) if v in SYMBOLS] if any_symbols: return True return False # @shared.profile def part2(mat): print(matrix.ppmx(mat, pad=False)) _nums = get_all_numbers_and_starting_coords(mat) nums = [] #get_row_coords(*coords, len(num)) splats = matrix.find_in_matrix(mat, "*", False) print(splats) def main(): mat = shared.load_file_char_matrix(shared.get_fname(3)) with shared.elapsed_timer() as elapsed: part1(mat) print("🕒", elapsed()) with shared.elapsed_timer() as elapsed: part2(mat) print("🕒", elapsed()) if __name__ == "__main__": main()