Advertisement
JonathanGupton

Advent of Code 2022 - Day 7 - Python

Dec 7th, 2022
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.97 KB | None | 0 0
  1. from __future__ import annotations
  2. from collections import deque
  3. from typing import Optional
  4.  
  5.  
  6. class Directory:
  7.     def __init__(self, name: str, size: int = 0, parent: Optional[Directory]=None):
  8.         self.name = name
  9.         self.size = size
  10.         self.parent = parent
  11.         self.children: dict[str, Directory] = {}
  12.  
  13.     def __hash__(self):
  14.         return hash(self.name)
  15.  
  16.     def __repr__(self):
  17.         return f"{self.__class__.__name__}(\"{self.name}\", {self.size})"
  18.  
  19.  
  20. def part_a(filepath):
  21.     max_dir_size = 100000
  22.     total = 0
  23.     current = Directory("root")
  24.     current.children["/"] = Directory("/")
  25.     with open(filepath, "r") as f:
  26.         for line in f.readlines():
  27.             match line.strip().split():
  28.                 case["$", "ls"]:
  29.                     continue
  30.                 case["$", "cd", ".."]:
  31.                     if current.size <= max_dir_size:
  32.                         total += current.size
  33.                     current.parent.size += current.size
  34.                     current = current.parent
  35.                 case ["$", "cd", name]:
  36.                     current = current.children[name]
  37.                 case ["dir", directory_name]:
  38.                     current.children[directory_name] = Directory(directory_name, parent=current)
  39.                 case [size, _]:
  40.                     current.size += int(size)
  41.     return total
  42.  
  43.  
  44. def part_b(filepath):
  45.     total_filesystem = 70_000_000
  46.     needed_space = 30_000_000
  47.     current_to_delete = 700_000_000
  48.     current = Directory("root")
  49.     current.children["/"] = Directory("/")
  50.     with open(filepath, "r") as f:
  51.         for line in f.readlines():
  52.             match line.strip().split():
  53.                 case ["$", "ls"]:
  54.                     continue
  55.                 case ["$", "cd", ".."]:
  56.                     current.parent.size += current.size
  57.                     current = current.parent
  58.                 case ["$", "cd", name]:
  59.                     current = current.children[name]
  60.                 case ["dir", directory_name]:
  61.                     current.children[directory_name] = Directory(directory_name, parent=current)
  62.                 case [size, _]:
  63.                     current.size += int(size)
  64.     while current.parent is not None:
  65.         current.parent.size += current.size
  66.         current = current.parent
  67.     available = total_filesystem - current.size
  68.  
  69.     queue = deque()
  70.     queue.append(current)
  71.  
  72.     while queue:
  73.         directory = queue.popleft()
  74.         if ((directory.size + available) >= needed_space) and (directory.size < current_to_delete):
  75.             current_to_delete = directory.size
  76.         for child in directory.children.values():
  77.             queue.append(child)
  78.  
  79.     return current_to_delete
  80.  
  81.  
  82. if __name__ == '__main__':
  83.     print("Example 1")
  84.     print(part_a(r"\data\day07_example.txt") == 95437)
  85.     print(part_a(r"\data\day07.txt"))
  86.     print(part_b(r"\data\day07_example.txt") == 24933642)
  87.     print(part_b(r"\data\day07.txt"))
  88.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement