Solved 2025 Day 1 Parts 1 & 2
This commit is contained in:
1 parent
4f07ea9f81
commit
1a711cd261
23 files changed
+9528
No files matched your search
@@ -0,0 +1,91 @@
|
||||
class Coord:
|
||||
x: int
|
||||
y: int
|
||||
|
||||
def __init__(self, x: int, y: int):
|
||||
self.x = x
|
||||
self.y = y
|
||||
|
||||
def __str__(self) -> str:
|
||||
return f'({self.x}, {self.y})'
|
||||
|
||||
def __eq__(self, other) -> bool:
|
||||
return other.x == self.x and other.y == self.y
|
||||
|
||||
def __add__(self, other):
|
||||
return Coord(self.x + other.x, self.y + other.y)
|
||||
|
||||
def __sub__(self, other):
|
||||
return Coord(self.x - other.x, self.y - other.y)
|
||||
|
||||
def __mul__(self, other):
|
||||
return Coord(self.x * other, self.y * other)
|
||||
|
||||
def __rmul__(self, other):
|
||||
return Coord(self.x * other, self.y * other)
|
||||
|
||||
def copy(self):
|
||||
return Coord(self.x, self.y)
|
||||
|
||||
UP = Coord(1, 0)
|
||||
DOWN = Coord(-1, 0)
|
||||
EAST = Coord(0, 1)
|
||||
WEST = Coord(0, -1)
|
||||
|
||||
class Maze:
|
||||
map: list[str]
|
||||
start: Coord
|
||||
end: Coord
|
||||
|
||||
def __init__(self, file_path: str):
|
||||
with open(file_path, 'r') as file:
|
||||
self.map = file.readlines()
|
||||
|
||||
for y, row in enumerate(self.map):
|
||||
for x, char in enumerate(row):
|
||||
if char == 'E':
|
||||
self.end = Coord(x, y)
|
||||
elif char == 'S':
|
||||
self.start = Coord(x, y)
|
||||
|
||||
def get_pos(self, pos: Coord) -> str:
|
||||
return self.map[pos.y][pos.x]
|
||||
|
||||
def is_wall(self, pos: Coord) -> bool:
|
||||
return self.get_pos(pos) == '#'
|
||||
|
||||
def is_end(self, pos: Coord) -> bool:
|
||||
return self.end == pos
|
||||
|
||||
def lowest_score(self, pos: Coord, score: int | None = 0, dir: Coord | None = None, facing: Coord | None = EAST) -> int:
|
||||
print(pos)
|
||||
if self.is_end(pos):
|
||||
return score
|
||||
|
||||
if self.is_wall(pos):
|
||||
return float('inf')
|
||||
|
||||
if dir:
|
||||
if dir != facing:
|
||||
score += 1000
|
||||
facing = dir
|
||||
|
||||
score += 1
|
||||
pos += facing
|
||||
|
||||
|
||||
return min([self.lowest_score(pos, score, dir, facing) for dir in [UP, DOWN, EAST, WEST]])
|
||||
|
||||
|
||||
def main():
|
||||
maze = Maze('test.text')
|
||||
print(maze.lowest_score(maze.start))
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in new issue
Block a user