feat: day 3 part 1 done

This commit is contained in:
dqnid committed 2026-08-26 17:55:39 +02:00
1 parent 279f5c77f5
commit 574660bced
5 files changed
+226 -1

No files matched your search

+69
View File
@@ -0,0 +1,69 @@
def run():
engine = Engine(r"src/assets/day_3.txt")
print(f"Part number sum: {engine.sum_part_numbers()}")
class Engine:
engine: list[str]
neutral_char = "."
def __init__(self, path: str):
self.engine = self.read_engine(path)
def sum_part_numbers(self) -> int:
sum = 0
for x in range(self.engine.__len__()):
y = 0
while y < self.engine[x].__len__():
if self.engine[x][y] != self.neutral_char and not self.position_is_symbol(x,y) and self.position_has_part(x,y):
number_pos = self.extract_number_from_position(x,y)
sum += number_pos[0]
y = number_pos[1] - 1
y += 1
return sum
def extract_number_from_position(self, x: int, y: int) -> tuple[int, int]:
n = ""
while self.position_is_number(x, y):
y -= 1
y += 1
while self.position_is_number(x, y):
n += self.engine[x][y]
y += 1
return (int(n), y)
def position_has_part(self, x: int, y: int) -> bool:
return (
self.position_is_symbol(x + 1, y)
or self.position_is_symbol(x - 1, y)
or self.position_is_symbol(x, y + 1)
or self.position_is_symbol(x, y - 1)
or self.position_is_symbol(x + 1, y + 1)
or self.position_is_symbol(x - 1, y - 1)
or self.position_is_symbol(x + 1, y - 1)
or self.position_is_symbol(x - 1, y + 1)
)
def position_is_symbol(self, x: int, y: int) -> bool:
if x >= self.engine.__len__() or x < 0 or y >= self.engine.__len__() or y < 0:
return False
try:
int(self.engine[x][y])
return False
except:
return self.engine[x][y] != self.neutral_char
def position_is_number(self, x: int, y: int) -> bool:
try:
int(self.engine[x][y])
return True
except:
return False
def read_engine(self, path: str) -> list[str]:
with open(path) as file:
return file.readlines()