Advent-of-Code/2022/day7.py

126 lines
3.3 KiB
Python
Raw Normal View History

2023-07-07 00:47:08 -04:00
#!/usr/bin/env python3
class File:
def __init__(self, name, size):
self.name = name
self.size = size
class Directory:
def __init__(self, name, parent):
self.parent = parent
self.name = name
self.directories = []
self.files = []
def addFile(self, file):
self.files.append(file)
def addDirectory(self, directory):
self.directories.append(directory)
def getSize(self):
self.size = 0
for file in self.files:
self.size += int(file.size)
for directory in self.directories:
self.size += int(directory.getSize())
return self.size
def __str__(self):
return self.name
class FileSystem:
def __init__(self):
self.root = Directory('/', '')
self.root.parent = self.root
self.current_directory = self.root
self.all_directories = []
def addFile(self, file):
self.root.files.append(file)
def addDirectory(self, directory):
self.root.directories.append(directory)
def getSize(self):
return self.root.getSize()
def change_directory(line, fs):
match line[2]:
case '..':
fs.current_directory = fs.current_directory.parent
case '/':
fs.current_directory = fs.root
case _:
for directory in fs.current_directory.directories:
if directory.name == line[2]:
fs.current_directory = directory
return
new_directory = Directory(line[2], fs.current_directory)
fs.all_directories.append(new_directory)
fs.current_directory.addDirectory(new_directory)
fs.current_directory = new_directory
def process_command(line, fs):
match line[1]:
case 'cd':
change_directory(line, fs)
case 'ls':
pass
def process_line(line, fs):
line = line.split()
match line[0]:
case '$':
process_command(line, fs)
case 'dir':
for directory in fs.current_directory.directories:
if directory.name == line[1]:
return
new_directory = Directory(line[1], fs.current_directory)
fs.all_directories.append(new_directory)
fs.current_directory.addDirectory(new_directory)
case _:
for file in fs.current_directory.files:
if file.name == line[1]:
file.size == line[0]
return
new_file = File(line[1], line[0])
fs.current_directory.addFile(new_file)
def main():
with open('day7', 'r') as file:
lines = file.readlines()
fs = FileSystem()
fs.current_directory = fs
for line in lines:
line = line.strip()
process_line(line, fs)
root_size = fs.getSize()
print(f'{fs.root.name} : {root_size}')
max_size = 30_000_000 - (70_000_000 - root_size)
smallest = 30_000_000
total_size = 0
for directory in fs.all_directories:
size = directory.getSize()
if size <= 100_000:
total_size += directory.getSize()
if size >= max_size:
if size < smallest:
smallest = size
print(total_size)
print(smallest)
if __name__ == '__main__':
main()