From e11bfb0f7a2a41d406466e0cc20be7eea7df6a7f Mon Sep 17 00:00:00 2001 From: lomakinae Date: Mon, 25 May 2026 02:32:13 +0300 Subject: [PATCH] feat: add Builder pattern --- lomakinae/docs/data/02/src/builder.py | 38 +++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 lomakinae/docs/data/02/src/builder.py diff --git a/lomakinae/docs/data/02/src/builder.py b/lomakinae/docs/data/02/src/builder.py new file mode 100644 index 0000000..1148ca0 --- /dev/null +++ b/lomakinae/docs/data/02/src/builder.py @@ -0,0 +1,38 @@ +from abc import ABC, abstractmethod + +from .maze import Maze + + +class MazeBuilder(ABC): + @abstractmethod + def build_from_file(self, filename: str) -> Maze: + pass + + +class TextFileMazeBuilder(MazeBuilder): + def build_from_file(self, filename: str) -> Maze: + with open(filename, "r", encoding="utf-8") as f: + lines = [line.rstrip("\n") for line in f.readlines()] + height = len(lines) + width = max(len(line) for line in lines) if height > 0 else 0 + + start_count = 0 + exit_count = 0 + maze = Maze(width, height) + + for y, line in enumerate(lines): + for x, ch in enumerate(line): + if ch == "#": + maze.set_cell(x, y, "wall") + elif ch == "S": + maze.set_cell(x, y, "start") + start_count += 1 + elif ch == "E": + maze.set_cell(x, y, "exit") + exit_count += 1 + else: + maze.set_cell(x, y, "path") + + if start_count != 1 or exit_count != 1: + raise ValueError(f"S={start_count}, E={exit_count}") + return maze