AdventOfCode/2022/Day7/Day7.py
2022-12-09 11:54:15 +01:00

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])}")