From 68bff21f4d555d027c4af604befbf27bab9a7f8d Mon Sep 17 00:00:00 2001 From: icaema Date: Sun, 3 Dec 2023 16:59:18 -0500 Subject: [PATCH] Cleaned up even more. its nice --- day-03/src/part02.py | 162 +++++++++++++++++++------------------------ 1 file changed, 72 insertions(+), 90 deletions(-) diff --git a/day-03/src/part02.py b/day-03/src/part02.py index 06dd2bb..6424972 100644 --- a/day-03/src/part02.py +++ b/day-03/src/part02.py @@ -2,18 +2,13 @@ import sys import copy from dataclasses import dataclass, field -DEBUG = True -padding=40 +DEBUG = False +debug_padding = 40 def debug_print(printname, *args): if not DEBUG: return - print(f"{'DEBUG::'+printname:<{padding}}", *args) - pass - - -FILENAME = "/home/icaema/Public/advent-of-code/day-03/data/p02data.txt" -f = open(FILENAME, "r") + print(f"{'DEBUG::'+printname:<{debug_padding}}", *args) @@ -22,36 +17,33 @@ parts = []; part_numbers = []; -@dataclass -class P: - x: int = 0 - y: int = 0 - - print("Parsing Input:") print("") print("===================================\n"); + + +FILENAME = "/home/icaema/Public/advent-of-code/day-03/data/p02data.txt" +f = open(FILENAME, "r") #for line in sys.stdin: for line in f.readlines(): line = line.strip() - #debug_print("input", line) engine.append(line) + #debug_print("input", line) +# [https://stackoverflow.com/questions/17870612/printing-a-two-dimensional-array-in-python] debug_print("engine") -# https://stackoverflow.com/questions/17870612/printing-a-two-dimensional-array-in-python -print('\n'.join([''.join(['{:1}'.format(item) for item in row]) - for row in engine])) +print('\n'.join([''.join(['{:1}'.format(item) for item in row]) for row in engine])) + + print("") -print("Proccessing:") -print("") +print(" Proccessing:") print("===================================\n"); #=====Extract Parts===== -debug_print("Extract Parts") @dataclass class Part: @@ -60,21 +52,22 @@ class Part: symbol: str = '' attached_numbers: set = field(default_factory=set) +def extractParts(engine, parts): + for y in range(len(engine)): + for x in range(len(engine[y])): + #debug_print("slot ",f"x:{x}, y:{y}", engine[y][x]) + if engine[y][x] == '.' or engine[y][x].isdigit(): + continue + parts.append(Part(x, y, engine[y][x])) + #debug_print("Found Part", f"{parts[-1]}") -for y in range(len(engine)): - for x in range(len(engine[y])): - #debug_print("slot ",f"x:{x}, y:{y}", engine[y][x]) - if engine[y][x] == '.' or engine[y][x].isdigit(): - continue - parts.append(Part(x, y, engine[y][x])) - #debug_print("Found Part", f"{parts[-1]}") -debug_print("Extract Parts", f"Found {len(parts)} parts") +print("Extract Parts") +extractParts(engine, parts) +print(f"Found {len(parts)} parts") #============================== #=====Extract Part Numbers===== -debug_print("Extract Part Numbers") - @dataclass class PartNumber: ascii: str = "" @@ -83,83 +76,72 @@ class PartNumber: def number(self): return int(self.ascii) +def extractPartNumbers(engine, part_numbers): + current_parsing_part_number = PartNumber() + for y in range(len(engine)): + for x in range(len(engine[y])): + if engine[y][x].isdigit(): + current_parsing_part_number.ascii += engine[y][x] + current_parsing_part_number.locations.append([x,y]) + else: + if current_parsing_part_number.ascii == "": + continue + #debug_print("PARTNOEXT", f"found complete part number: {current_parsing_part_number['ascii'].rjust(4)}, locations: {current_parsing_part_number['locations']}") + part_numbers.append(current_parsing_part_number) + current_parsing_part_number = PartNumber() + +print("Extract Part Numbers") +extractPartNumbers(engine, part_numbers) +print(f"Found {len(part_numbers)} part numbers") -current_parsing_part_number = PartNumber() -for y in range(len(engine)): - for x in range(len(engine[y])): - if engine[y][x].isdigit(): - current_parsing_part_number.ascii += engine[y][x] - current_parsing_part_number.locations.append(P(x,y)) - else: - if current_parsing_part_number.ascii == "": - continue - #debug_print("PARTNOEXT", f"found complete part number: {current_parsing_part_number['ascii'].rjust(4)}, locations: {current_parsing_part_number['locations']}") - part_numbers.append(current_parsing_part_number) - current_parsing_part_number = PartNumber() - pass - pass -debug_print("Extract Part Numbers", f"Found {len(part_numbers)} part numbers") #============================== -#mutates part_numbers and parts -def linkPartNumbersToParts(engine, part_numbers, parts): - window = \ - [[[-1,-1],[0,-1],[1,-1]], - [[-1, 0],[0, 0],[1, 0]], - [[-1, 1],[0, 1],[1, 1]]] - +#=====Link Part Numbers to Parts===== + +def linkPartNumbersToParts(part_numbers, parts): + window = [ + [-1,-1],[0,-1],[1,-1], + [-1, 0],[0, 0],[1, 0], + [-1, 1],[0, 1],[1, 1]] for part_number in part_numbers: - for digit in part_number.locations: - for w_y in window: - for transform in w_y: - transformed_x = digit.x + transform[0] - transformed_y = digit.y + transform[1] - if transformed_y < 0 or transformed_y >= len(engine): - continue - if transformed_x < 0 or transformed_x >= len(engine[transformed_y]): - continue - debug_print("linkPartNumbersToParts", f"letter {digit} point [{transformed_x}, {transformed_y}] is a valid coord. contains: {engine[transformed_y][transformed_x]}") - if engine[transformed_y][transformed_x] != '.' and not engine[transformed_y][transformed_x].isdigit(): - debug_print("numberIsPartOfPart", f"Number is part of part") - part_number.is_part_of_part= True - for part in parts: - if part.x != transformed_x or part.y != transformed_y: - continue - part.attached_numbers.add(part_number.number()) + search_range = [[(digit[0] + t[0]), (digit[1] + t[1])] for t in window for digit in part_number.locations] + for part in parts: + if [part.x, part.y] in search_range: + part_number.is_part_of_part= True + part.attached_numbers.add(part_number.number()) -linkPartNumbersToParts(engine, part_numbers, parts) +print("Linking part numbers to parts") +linkPartNumbersToParts(part_numbers, parts) +#print(f"Linked {len(list(filter(lambda x: x.is_part_of_part == True, part_numbers)))} part numbers to {len(list(filter(lambda x: len(x.attached_numbers) != 0, parts)))} parts") + +#============================== - -#for part_number in part_numbers: -# debug_print("part_number print", part_number) - - -#for part in parts: -# debug_print("parts print", part) +if DEBUG: + for part_number in part_numbers: + debug_print("part_number print", part_number) + for part in parts: + debug_print("parts print", part) print("") -print("Calculating Answer:") -print("") +print(" Calculate Answer:") print("===================================\n"); + part_numbers_that_are_attached_to_parts = [part_number.number() for part_number in part_numbers if part_number.is_part_of_part == True] -debug_print("Attached Parts", f"Found {len(part_numbers_that_are_attached_to_parts)} part numbers that are attached to a part") +print(f"Found {len(part_numbers_that_are_attached_to_parts)} part numbers that are attached to a part") gears = [part.attached_numbers for part in parts if part.symbol == '*' and len(part.attached_numbers) == 2] -debug_print("Find Gears", f"Found {len(gears)} gears") +print(f"Found {len(gears)} gears") gear_ratios = [pn.pop()*pn.pop() for pn in gears] -#for part in parts: -# debug_print("parts print", part) -# part.getAttachedNumbers(part_numbers) print("") - +print(" Answer:") print("===================================\n"); -print("sum of part numbers that are attached to parts") -print(f"Answer: \n{sum(part_numbers_that_are_attached_to_parts)}"); -print("sum of gear ratios") -print(f"Answer: \n{sum(gear_ratios)}"); \ No newline at end of file +print("sum of part numbers that are attached to parts:") +print(sum(part_numbers_that_are_attached_to_parts)); +print("sum of gear ratios:") +print(sum(gear_ratios)); \ No newline at end of file