diff options
| -rw-r--r-- | day7/__init__.py | 32 |
1 files changed, 14 insertions, 18 deletions
diff --git a/day7/__init__.py b/day7/__init__.py index 279201a..4adb0ca 100644 --- a/day7/__init__.py +++ b/day7/__init__.py | |||
| @@ -43,7 +43,7 @@ class Folder(Inode): | |||
| 43 | def size(self, value: int): | 43 | def size(self, value: int): |
| 44 | pass | 44 | pass |
| 45 | 45 | ||
| 46 | def __iter__(self): | 46 | def __iter__(self) -> Iterator[Inode]: |
| 47 | yield self | 47 | yield self |
| 48 | 48 | ||
| 49 | for inode in self.children.values(): | 49 | for inode in self.children.values(): |
| @@ -60,15 +60,14 @@ class File(Inode): | |||
| 60 | 60 | ||
| 61 | 61 | ||
| 62 | @dataclass | 62 | @dataclass |
| 63 | class FileSystem: | 63 | class FileSystem(Folder): |
| 64 | current: Folder = None | 64 | pwd: Folder = None |
| 65 | root: Folder = field(default_factory=lambda: Folder(name="/")) | ||
| 66 | 65 | ||
| 67 | capacity = 70000000 | 66 | capacity = 70000000 |
| 68 | 67 | ||
| 69 | @classmethod | 68 | @classmethod |
| 70 | def from_commands(cls, commands: List[Command]) -> "FileSystem": | 69 | def from_commands(cls, commands: List[Command]) -> "FileSystem": |
| 71 | file_system = cls() | 70 | file_system = cls(name="/") |
| 72 | 71 | ||
| 73 | for command in commands: | 72 | for command in commands: |
| 74 | file_system.parse_command(command) | 73 | file_system.parse_command(command) |
| @@ -76,7 +75,7 @@ class FileSystem: | |||
| 76 | return file_system | 75 | return file_system |
| 77 | 76 | ||
| 78 | def __post_init__(self): | 77 | def __post_init__(self): |
| 79 | self.current = self.root | 78 | self.pwd = self |
| 80 | 79 | ||
| 81 | def parse_command(self, command: Command): | 80 | def parse_command(self, command: Command): |
| 82 | match command.action: | 81 | match command.action: |
| @@ -90,36 +89,33 @@ class FileSystem: | |||
| 90 | size, name = item.split(" ") | 89 | size, name = item.split(" ") |
| 91 | 90 | ||
| 92 | inode = ( | 91 | inode = ( |
| 93 | Folder(name=name, parent=self.current) | 92 | Folder(name=name, parent=self.pwd) |
| 94 | if size == "dir" | 93 | if size == "dir" |
| 95 | else File(name=name, parent=self.current, size=int(size)) | 94 | else File(name=name, parent=self.pwd, size=int(size)) |
| 96 | ) | 95 | ) |
| 97 | 96 | ||
| 98 | if name in self.current.children: | 97 | if name in self.pwd.children: |
| 99 | raise Exception(f"File/Folder already exists {name}") | 98 | raise Exception(f"File/Folder already exists {name}") |
| 100 | 99 | ||
| 101 | self.current.children[name] = inode | 100 | self.pwd.children[name] = inode |
| 102 | 101 | ||
| 103 | def change_directory(self, name: str): | 102 | def change_directory(self, name: str): |
| 104 | match name: | 103 | match name: |
| 105 | case "..": | 104 | case "..": |
| 106 | new_dir = self.current.parent | 105 | new_dir = self.pwd.parent |
| 107 | case "/": | 106 | case "/": |
| 108 | new_dir = self.root | 107 | new_dir = self |
| 109 | case name: | 108 | case name: |
| 110 | new_dir = self.current.children.get(name) | 109 | new_dir = self.pwd.children.get(name) |
| 111 | 110 | ||
| 112 | if new_dir is None or isinstance(new_dir, File): | 111 | if new_dir is None or isinstance(new_dir, File): |
| 113 | raise Exception(f"No such folder {name}") | 112 | raise Exception(f"No such folder {name}") |
| 114 | 113 | ||
| 115 | self.current = new_dir | 114 | self.pwd = new_dir |
| 116 | |||
| 117 | def __iter__(self): | ||
| 118 | return iter(self.root) | ||
| 119 | 115 | ||
| 120 | @property | 116 | @property |
| 121 | def free_space(self): | 117 | def free_space(self): |
| 122 | return self.capacity - self.root.size | 118 | return self.capacity - self.size |
| 123 | 119 | ||
| 124 | 120 | ||
| 125 | class Assignment(BaseAssignment, ABC): | 121 | class Assignment(BaseAssignment, ABC): |
