Skip to content

Commit 8f2ada5

Browse files
committed
Add intermediate step directories
1 parent 2313ba1 commit 8f2ada5

57 files changed

Lines changed: 2136 additions & 0 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
[build-system]
2+
requires = ["setuptools>=64.0.0", "wheel"]
3+
build-backend = "setuptools.build_meta"
4+
5+
[project]
6+
name = "maze-solver"
7+
version = "1.0.0"

python-maze-solver/source_code_step_1/src/maze_solver/__init__.py

Whitespace-only changes.

python-maze-solver/source_code_step_1/src/maze_solver/models/__init__.py

Whitespace-only changes.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
[build-system]
2+
requires = ["setuptools>=64.0.0", "wheel"]
3+
build-backend = "setuptools.build_meta"
4+
5+
[project]
6+
name = "maze-solver"
7+
version = "1.0.0"

python-maze-solver/source_code_step_2/src/maze_solver/__init__.py

Whitespace-only changes.

python-maze-solver/source_code_step_2/src/maze_solver/models/__init__.py

Whitespace-only changes.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from enum import IntFlag, auto
2+
3+
4+
class Border(IntFlag):
5+
EMPTY = 0
6+
TOP = auto()
7+
BOTTOM = auto()
8+
LEFT = auto()
9+
RIGHT = auto()
10+
11+
@property
12+
def corner(self) -> bool:
13+
return self in (
14+
self.TOP | self.LEFT,
15+
self.TOP | self.RIGHT,
16+
self.BOTTOM | self.LEFT,
17+
self.BOTTOM | self.RIGHT,
18+
)
19+
20+
@property
21+
def dead_end(self) -> bool:
22+
return self.bit_count() == 3
23+
24+
@property
25+
def intersection(self) -> bool:
26+
return self.bit_count() < 2
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
from dataclasses import dataclass
2+
from functools import cached_property
3+
from typing import Iterator
4+
5+
from maze_solver.models.role import Role
6+
from maze_solver.models.square import Square
7+
8+
9+
@dataclass(frozen=True)
10+
class Maze:
11+
squares: tuple[Square, ...]
12+
13+
def __post_init__(self) -> None:
14+
validate_indices(self)
15+
validate_rows_columns(self)
16+
validate_entrance(self)
17+
validate_exit(self)
18+
19+
def __iter__(self) -> Iterator[Square]:
20+
return iter(self.squares)
21+
22+
def __getitem__(self, index: int) -> Square:
23+
return self.squares[index]
24+
25+
@cached_property
26+
def width(self):
27+
return max(square.column for square in self) + 1
28+
29+
@cached_property
30+
def height(self):
31+
return max(square.row for square in self) + 1
32+
33+
@cached_property
34+
def entrance(self) -> Square:
35+
return next(sq for sq in self if sq.role is Role.ENTRANCE)
36+
37+
@cached_property
38+
def exit(self) -> Square:
39+
return next(sq for sq in self if sq.role is Role.EXIT)
40+
41+
42+
def validate_indices(maze: Maze) -> None:
43+
assert [square.index for square in maze] == list(
44+
range(len(maze.squares))
45+
), "Wrong square.index"
46+
47+
48+
def validate_rows_columns(maze: Maze) -> None:
49+
for y in range(maze.height):
50+
for x in range(maze.width):
51+
square = maze[y * maze.width + x]
52+
assert square.row == y, "Wrong square.row"
53+
assert square.column == x, "Wrong square.column"
54+
55+
56+
def validate_entrance(maze: Maze) -> None:
57+
assert 1 == sum(
58+
1 for square in maze if square.role is Role.ENTRANCE
59+
), "Must be exactly one entrance"
60+
61+
62+
def validate_exit(maze: Maze) -> None:
63+
assert 1 == sum(
64+
1 for square in maze if square.role is Role.EXIT
65+
), "Must be exactly one exit"
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from enum import IntEnum, auto
2+
3+
4+
class Role(IntEnum):
5+
NONE = 0
6+
ENEMY = auto()
7+
ENTRANCE = auto()
8+
EXIT = auto()
9+
EXTERIOR = auto()
10+
REWARD = auto()
11+
WALL = auto()
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from dataclasses import dataclass
2+
3+
from maze_solver.models.border import Border
4+
from maze_solver.models.role import Role
5+
6+
7+
@dataclass(frozen=True)
8+
class Square:
9+
index: int
10+
row: int
11+
column: int
12+
border: Border
13+
role: Role = Role.NONE

0 commit comments

Comments
 (0)