98 lines
2.1 KiB
Python
98 lines
2.1 KiB
Python
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]))
|