Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from __future__ import annotations
- from collections import deque
- from typing import Optional
- class Directory:
- def __init__(self, name: str, size: int = 0, parent: Optional[Directory]=None):
- self.name = name
- self.size = size
- self.parent = parent
- self.children: dict[str, Directory] = {}
- def __hash__(self):
- return hash(self.name)
- def __repr__(self):
- return f"{self.__class__.__name__}(\"{self.name}\", {self.size})"
- def part_a(filepath):
- max_dir_size = 100000
- total = 0
- current = Directory("root")
- current.children["/"] = Directory("/")
- with open(filepath, "r") as f:
- for line in f.readlines():
- match line.strip().split():
- case["$", "ls"]:
- continue
- case["$", "cd", ".."]:
- if current.size <= max_dir_size:
- total += current.size
- current.parent.size += current.size
- current = current.parent
- case ["$", "cd", name]:
- current = current.children[name]
- case ["dir", directory_name]:
- current.children[directory_name] = Directory(directory_name, parent=current)
- case [size, _]:
- current.size += int(size)
- return total
- def part_b(filepath):
- total_filesystem = 70_000_000
- needed_space = 30_000_000
- current_to_delete = 700_000_000
- current = Directory("root")
- current.children["/"] = Directory("/")
- with open(filepath, "r") as f:
- for line in f.readlines():
- match line.strip().split():
- case ["$", "ls"]:
- continue
- case ["$", "cd", ".."]:
- current.parent.size += current.size
- current = current.parent
- case ["$", "cd", name]:
- current = current.children[name]
- case ["dir", directory_name]:
- current.children[directory_name] = Directory(directory_name, parent=current)
- case [size, _]:
- current.size += int(size)
- while current.parent is not None:
- current.parent.size += current.size
- current = current.parent
- available = total_filesystem - current.size
- queue = deque()
- queue.append(current)
- while queue:
- directory = queue.popleft()
- if ((directory.size + available) >= needed_space) and (directory.size < current_to_delete):
- current_to_delete = directory.size
- for child in directory.children.values():
- queue.append(child)
- return current_to_delete
- if __name__ == '__main__':
- print("Example 1")
- print(part_a(r"\data\day07_example.txt") == 95437)
- print(part_a(r"\data\day07.txt"))
- print(part_b(r"\data\day07_example.txt") == 24933642)
- print(part_b(r"\data\day07.txt"))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement