Cleaned up even more. its nice

This commit is contained in:
icaema 2023-12-03 16:59:18 -05:00
parent d5e3d9eb58
commit 68bff21f4d
1 changed files with 72 additions and 90 deletions

View File

@ -2,18 +2,13 @@ import sys
import copy import copy
from dataclasses import dataclass, field from dataclasses import dataclass, field
DEBUG = True DEBUG = False
padding=40 debug_padding = 40
def debug_print(printname, *args): def debug_print(printname, *args):
if not DEBUG: if not DEBUG:
return return
print(f"{'DEBUG::'+printname:<{padding}}", *args) print(f"{'DEBUG::'+printname:<{debug_padding}}", *args)
pass
FILENAME = "/home/icaema/Public/advent-of-code/day-03/data/p02data.txt"
f = open(FILENAME, "r")
@ -22,36 +17,33 @@ parts = [];
part_numbers = []; part_numbers = [];
@dataclass
class P:
x: int = 0
y: int = 0
print("Parsing Input:") print("Parsing Input:")
print("") print("")
print("===================================\n"); 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 sys.stdin:
for line in f.readlines(): for line in f.readlines():
line = line.strip() line = line.strip()
#debug_print("input", line)
engine.append(line) engine.append(line)
#debug_print("input", line)
# [https://stackoverflow.com/questions/17870612/printing-a-two-dimensional-array-in-python]
debug_print("engine") 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("")
print("Proccessing:") print(" Proccessing:")
print("")
print("===================================\n"); print("===================================\n");
#=====Extract Parts===== #=====Extract Parts=====
debug_print("Extract Parts")
@dataclass @dataclass
class Part: class Part:
@ -60,21 +52,22 @@ class Part:
symbol: str = '' symbol: str = ''
attached_numbers: set = field(default_factory=set) 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)): print("Extract Parts")
for x in range(len(engine[y])): extractParts(engine, parts)
#debug_print("slot ",f"x:{x}, y:{y}", engine[y][x]) print(f"Found {len(parts)} parts")
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")
#============================== #==============================
#=====Extract Part Numbers===== #=====Extract Part Numbers=====
debug_print("Extract Part Numbers")
@dataclass @dataclass
class PartNumber: class PartNumber:
ascii: str = "" ascii: str = ""
@ -83,83 +76,72 @@ class PartNumber:
def number(self): def number(self):
return int(self.ascii) 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 #=====Link Part Numbers to Parts=====
def linkPartNumbersToParts(engine, part_numbers, parts):
window = \ def linkPartNumbersToParts(part_numbers, parts):
[[[-1,-1],[0,-1],[1,-1]], window = [
[[-1, 0],[0, 0],[1, 0]], [-1,-1],[0,-1],[1,-1],
[[-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 part_number in part_numbers:
for digit in part_number.locations: search_range = [[(digit[0] + t[0]), (digit[1] + t[1])] for t in window for digit in part_number.locations]
for w_y in window: for part in parts:
for transform in w_y: if [part.x, part.y] in search_range:
transformed_x = digit.x + transform[0] part_number.is_part_of_part= True
transformed_y = digit.y + transform[1] part.attached_numbers.add(part_number.number())
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())
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")
#==============================
if DEBUG:
#for part_number in part_numbers: for part_number in part_numbers:
# debug_print("part_number print", part_number) debug_print("part_number print", part_number)
for part in parts:
debug_print("parts print", part)
#for part in parts:
# debug_print("parts print", part)
print("") print("")
print("Calculating Answer:") print(" Calculate Answer:")
print("")
print("===================================\n"); 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] 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] 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] 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("")
print(" Answer:")
print("===================================\n"); print("===================================\n");
print("sum of part numbers that are attached to parts") print("sum of part numbers that are attached to parts:")
print(f"Answer: \n{sum(part_numbers_that_are_attached_to_parts)}"); print(sum(part_numbers_that_are_attached_to_parts));
print("sum of gear ratios") print("sum of gear ratios:")
print(f"Answer: \n{sum(gear_ratios)}"); print(sum(gear_ratios));