import os input = open(os.path.dirname(__file__) + "/input.txt", "r").readlines() class Directory(object): def __init__(self, name: str, parent): self.name = name self.files = {} self.dirs = {} self.parent = parent def add_file(self, name: str, size: int): self.files[name] = size def add_directory(self, name, dir): self.dirs[name] = dir def get_directory(self, dir: str): return self.dirs[dir] def get_parent(self): return self.parent def size(self): tot = 0 for i in self.files.values(): tot += int(i) for d in self.dirs.values(): tot += int(d.size()) return tot def directories(self): return self.dirs.values() def pwd(self): str = '' if self.parent != None: str = self.parent.pwd() + '/' + self.name return str def __str__(self): return self.pwd() + " " + str(self.size()) class Dictlist(dict): def __setitem__(self, key, value): try: self[key] except KeyError: super(Dictlist, self).__setitem__(key, []) self[key].append(value) dirs = {'/': Directory('/', None)} def parseLine(line: str): return line curdir = dirs['/'] for l in input: cmd = l.strip().split(' ') if cmd[1] == "cd": if cmd[2] == '..': curdir = curdir.get_parent() elif cmd[2] != '/': curdir = curdir.get_directory(cmd[2]) if (cmd[0] == 'dir'): dirs[curdir.pwd()+cmd[1]] = Directory(cmd[1], curdir) curdir.add_directory(cmd[1], dirs[curdir.pwd()+cmd[1]]) if str(cmd[0]).isnumeric(): curdir.add_file(cmd[1], cmd[0]) tot = 0 usedspace = dirs['/'].size() freespace = 70000000 - usedspace candidates = [] for i in dirs.values(): dirsize = i.size() if dirsize <= 100000: tot += dirsize if (freespace + dirsize) > 30000000: candidates.append(dirsize) print("Part 1: " + str(tot)) candidates.sort() print("Part 2: " + str(candidates[0]))