99 lines
2.5 KiB
Python
99 lines
2.5 KiB
Python
class File:
|
|
def __init__(self, name: str, fileSize: int):
|
|
self.name = name
|
|
self.size = fileSize
|
|
|
|
def __str__(self) -> str:
|
|
return f"{self.name} - {self.size}"
|
|
|
|
|
|
class Directory:
|
|
subdiretories: []
|
|
files: [File]
|
|
|
|
def __init__(self, name: str, parent):
|
|
self.name = name
|
|
self.parent = parent
|
|
self.subdiretories = []
|
|
self.files = []
|
|
|
|
def size(self) -> int:
|
|
total = 0
|
|
for sub in self.subdiretories:
|
|
total += sub.size()
|
|
|
|
for file in self.files:
|
|
total += file.size
|
|
|
|
return total
|
|
|
|
def addSub(self, other):
|
|
self.subdiretories.append(other)
|
|
|
|
def addFile(self, file: File):
|
|
self.files.append(file)
|
|
|
|
def __str__(self) -> str:
|
|
rv = f"Dir: {self.name} - {self.size()}\n"
|
|
for file in self.files:
|
|
rv += f"\t File: {file}\n"
|
|
|
|
for sub in self.subdiretories:
|
|
rv += f"\t {sub}\n"
|
|
|
|
return rv
|
|
|
|
|
|
def checkAllowedDirs(currDir: Directory):
|
|
for sub in currDir.subdiretories:
|
|
if sub.size() < 100000:
|
|
allowedDirs.append(sub)
|
|
|
|
checkAllowedDirs(sub)
|
|
|
|
|
|
def checkDeletable(currDir: Directory):
|
|
for sub in currDir.subdiretories:
|
|
if sub.size() >= SPACENEEDEDTOBECLREAED:
|
|
possibleDeletes.append(sub)
|
|
checkDeletable(sub)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
with open("input.txt", "r") as f:
|
|
raw = [line.replace("\n", "") for line in f.readlines()]
|
|
|
|
currentlyLS = False
|
|
|
|
fileSystem = Directory("ROOT", "")
|
|
currentDir: Directory = fileSystem
|
|
|
|
for line in raw:
|
|
if line.startswith("$"):
|
|
if "cd" in line:
|
|
where = line.split(" ")[2]
|
|
if where == "..":
|
|
currentDir = currentDir.parent
|
|
else:
|
|
createdDir = Directory(where, currentDir)
|
|
currentDir.addSub(createdDir)
|
|
currentDir = createdDir
|
|
else:
|
|
size, currentName = line.split(" ")
|
|
if size.isnumeric():
|
|
currentDir.addFile(File(currentName, int(size)))
|
|
|
|
allowedDirs = []
|
|
checkAllowedDirs(fileSystem)
|
|
print(f"Solution 1: {sum([allowedDir.size() for allowedDir in allowedDirs])}")
|
|
|
|
possibleDeletes = []
|
|
|
|
TOTALSPACE = 70000000
|
|
SPACEREQUIRED = 30000000
|
|
USEDSPACE = fileSystem.size()
|
|
SPACENEEDEDTOBECLREAED = SPACEREQUIRED - (TOTALSPACE - USEDSPACE)
|
|
|
|
checkDeletable(fileSystem)
|
|
|
|
print(f"Solution 2: {min([possibleDelete.size() for possibleDelete in possibleDeletes])}")
|