feat: day 7 complete
This commit is contained in:
117
day7/main.py
Normal file
117
day7/main.py
Normal file
@@ -0,0 +1,117 @@
|
||||
class Directory:
|
||||
def __init__(self, name, parent):
|
||||
self.items = []
|
||||
self.name = name
|
||||
self.parent = parent
|
||||
|
||||
def get_size(self):
|
||||
total_size = 0
|
||||
for item in self.items:
|
||||
if isinstance(item, Directory):
|
||||
total_size += item.get_size()
|
||||
else:
|
||||
total_size += item.size
|
||||
return total_size
|
||||
|
||||
# part 1 start
|
||||
|
||||
def get_sperate_directory_sizes_by_max(self, sizes_arr, size_max=100000):
|
||||
total_size = 0
|
||||
for item in self.items:
|
||||
if isinstance(item, Directory):
|
||||
size = item.get_sperate_directory_sizes_by_max(
|
||||
sizes_arr, size_max)
|
||||
total_size += size
|
||||
if size < size_max:
|
||||
sizes_arr.append(size)
|
||||
else:
|
||||
total_size += item.size
|
||||
return total_size
|
||||
|
||||
# part 1 end
|
||||
|
||||
# part 2 start
|
||||
|
||||
def get_sperate_directory_sizes_by_min(self, arr, size_min):
|
||||
total_size = 0
|
||||
for item in self.items:
|
||||
if isinstance(item, Directory):
|
||||
size = item.get_sperate_directory_sizes_by_min(
|
||||
arr, size_min)
|
||||
total_size += size
|
||||
if size >= size_min:
|
||||
arr.append((size, item.name))
|
||||
else:
|
||||
total_size += item.size
|
||||
return total_size
|
||||
|
||||
# part 2 end
|
||||
|
||||
def add_item(self, item):
|
||||
self.items.append(item)
|
||||
|
||||
def get_directory(self, name):
|
||||
for item in self.items:
|
||||
if isinstance(item, Directory) and item.name == name:
|
||||
return item
|
||||
return None
|
||||
|
||||
def get_file(self, name):
|
||||
for item in self.items:
|
||||
if isinstance(item, File) and item.name == name:
|
||||
return item
|
||||
return None
|
||||
|
||||
|
||||
class File:
|
||||
def __init__(self, name, size):
|
||||
self.name = name
|
||||
self.size = size
|
||||
|
||||
|
||||
input_file = open("input.txt", "r")
|
||||
lines = input_file.readlines()
|
||||
|
||||
root = Directory("/", None)
|
||||
pwd = root
|
||||
|
||||
for line in lines:
|
||||
line = line.strip()
|
||||
if line.startswith("$"):
|
||||
command = line.split(" ")[1]
|
||||
if "ls" in command:
|
||||
continue
|
||||
elif "cd" in command:
|
||||
directory = line.split(" ")[-1]
|
||||
if directory == "..":
|
||||
pwd = pwd.parent
|
||||
elif directory == "/":
|
||||
pwd = root
|
||||
else:
|
||||
pwd = pwd.get_directory(directory)
|
||||
else:
|
||||
item = line.split(" ")
|
||||
if "dir" in item[0]:
|
||||
directory = pwd.get_directory(item[1])
|
||||
if not directory:
|
||||
new_directory = Directory(item[1], pwd)
|
||||
pwd.add_item(new_directory)
|
||||
else:
|
||||
_file = pwd.get_file(item[1])
|
||||
if not _file:
|
||||
new_file = File(item[1], int(item[0]))
|
||||
pwd.add_item(new_file)
|
||||
|
||||
# part 1
|
||||
|
||||
sizes_arr = []
|
||||
root.get_sperate_directory_sizes_by_max(sizes_arr)
|
||||
print("Part 1: " + str(sum(sizes_arr)))
|
||||
|
||||
# part 2
|
||||
|
||||
unused_space = 70000000 - root.get_size()
|
||||
space_needed = 30000000 - unused_space
|
||||
arr = []
|
||||
root.get_sperate_directory_sizes_by_min(arr, space_needed)
|
||||
print("Part 2: " + str(min(arr)))
|
||||
Reference in New Issue
Block a user