feat: day 3 part 1 done
This commit is contained in:
1 parent
279f5c77f5
commit
574660bced
5 files changed
+226
-1
No files matched your search
@@ -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()
|
||||
Reference in new issue
Block a user