Advent of Code 2022 day 7
Kept using the number 4 million instead of 40 million for part 2. Need to look
closer next time. Replicating the filesystem was fun. reading was totally
unnecessary, could have just left out the ls case.
with open("7.txt") as f:
lines = f.read().splitlines()
filesystem = {}
cwd = "/"
reading = False
for line in lines:
# command
if line.startswith("$"):
reading = False
# cd
if line.startswith("$ cd "):
d = line.split("$ cd ")[1]
if d == "/":
cwd = "/"
elif d == "..":
cwd = "/".join(cwd.split("/")[:-2])+"/"
else:
cwd += d+"/"
# ls
elif line == "$ ls":
reading = True
else:
# init if not in
if cwd not in filesystem:
filesystem[cwd] = []
# dir
if line.startswith("dir"):
filesystem[cwd].append(line.split(" ")[1])
else:
filesystem[cwd].append(int(line.split(" ")[0]))
def d_size(d):
sum = 0
for f in filesystem[d]:
if type(f) is int:
sum += f
else:
sum += d_size(d+f+"/")
return sum
total = 0
for d in filesystem:
if d_size(d) < 100000:
total += d_size(d)
print(total)
# part 2
dir_sizes = {d: d_size(d) for d in filesystem}
cur_size = dir_sizes["/"]
print(min(size for _, size in dir_sizes.items() if cur_size-size < 40000000))