illuminati229

Untitled

Dec 7th, 2022
324
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.83 KB | None | 0 0
  1. class Filesystem:
  2.     def __init__(self, root_name):
  3.         self.files = []
  4.         self.folders = []
  5.         self.root = self.Folder(root_name)
  6.         self.folders.append(self.root)
  7.         self.pwd = self.root
  8.  
  9.     class Folder:
  10.         def __init__(self, name, parent=None):
  11.             self.name = name
  12.             self.parent = parent
  13.             self.children = []
  14.             self.size = None
  15.  
  16.         def add_child(self, child):
  17.             self.children.append(child)
  18.  
  19.         def get_size(self):
  20.             if self.size is None:
  21.                 self.size = sum([child.get_size() for child in self.children])
  22.                 return self.size
  23.             else:
  24.                 return self.size
  25.  
  26.     class File:
  27.         def __init__(self, name: str, size: int, parent):
  28.             self.parent = parent
  29.             self.size = size
  30.             self.name = name
  31.  
  32.         def get_size(self):
  33.             return self.size
  34.  
  35.     def add_folder(self, new_folder_name: str):
  36.         new_folder = self.Folder(new_folder_name, self.pwd)
  37.         self.folders.append(new_folder)
  38.         self.pwd.add_child(new_folder)
  39.  
  40.     def add_file(self, file_name, file_size):
  41.         new_file = self.File(file_name, file_size, self.pwd)
  42.         self.pwd.add_child(new_file)
  43.         self.files.append(new_file)
  44.  
  45.     def nav_down(self, down_folder_name: str):
  46.         for child in self.pwd.children:
  47.             if child.name == down_folder_name:
  48.                 self.pwd = child
  49.  
  50.     def nav_up(self):
  51.         self.pwd = self.pwd.parent
  52.  
  53.  
  54. def day07(filepath, delete_dir=False):
  55.     with open(filepath) as fin:
  56.         lines = fin.readlines()
  57.  
  58.     filesystem = Filesystem('/')
  59.     for line in lines[2:]:
  60.         if line[:3] == 'dir':
  61.             filesystem.add_folder(line.split()[-1])
  62.         elif line[0].isdigit():
  63.             filesystem.add_file(line.split()[1], int(line.split()[0]))
  64.         elif line.strip() == '$ cd ..':
  65.             filesystem.nav_up()
  66.         elif line[:4] == '$ cd':
  67.             filesystem.nav_down(line.split()[-1])
  68.         else:
  69.             pass
  70.  
  71.     if not delete_dir:
  72.         total = 0
  73.         for folder in filesystem.folders:
  74.             if folder.get_size() <= 100000:
  75.                 total += folder.get_size()
  76.  
  77.         return total
  78.     else:
  79.         min_delete = filesystem.root.get_size() - 40000000
  80.         min_delete_actual = 7000000000000
  81.         for folder in filesystem.folders:
  82.             if folder.get_size() > min_delete:
  83.                 if folder.get_size() < min_delete_actual:
  84.                     min_delete_actual = folder.get_size()
  85.         return min_delete_actual
  86.  
  87.  
  88. def main():
  89.     assert day07('test07') == 95437
  90.     print(day07('input07'))
  91.  
  92.     assert day07('test07', True) == 24933642
  93.     print(day07('input07', True))
  94.  
  95.  
  96. if __name__ == '__main__':
  97.     main()
  98.  
Advertisement
Add Comment
Please, Sign In to add comment