advent-of-code/2022/python/day07.py

161 lines
3.8 KiB
Python

from pprint import pprint as pp
from pathlib import Path
import json
from shared import load_rows
import re
from functools import reduce
import operator
PWD = []
FS = {"/": {".": {"size": 0, "files": []}}}
def get_keys(input_dict):
for key, value in input_dict.items():
if isinstance(value, dict):
for subkey in get_keys(value):
yield key + "," + subkey
else:
if key in ("files"):
continue
yield f"{value}"
def getFromDict(mapList):
return reduce(operator.getitem, mapList, FS)
def setInDict(mapList, value):
getFromDict(mapList[:-1])[mapList[-1]] = value
def addInDict(mapList, filename, value):
try:
v = getFromDict(mapList[:-1])[mapList[-1]]
v += value
getFromDict(mapList[:-1])[mapList[-1]] = v
except KeyError:
getFromDict(mapList[:-1])["."] = {"size": 0, "files": []}
v = getFromDict(mapList[:-1])[mapList[-1]]
v["size"] += 0 # Value
v["files"].append(f"{filename}:{value}")
getFromDict(mapList[:-1])[mapList[-1]] = v
except TypeError:
v = getFromDict(mapList[:-1])["."]
v["size"] += 0 # value
v["files"].append(f"{filename}:{value}")
getFromDict(mapList[:-1])[mapList[-1]] = v
def part1(rows):
build_fs(rows)
# calculate_directories()
def calculate_directories():
keys = list(get_keys(FS))
new_FS = {}
for key in keys:
pwd = key.split(",")
size = int(pwd.pop()) # split out size
pwd.pop() # remove .
pwd_key = ",".join(pwd)
parent = ",".join(pwd[:-1])
new_FS[pwd_key] = {"size": size, "full_size": size, "parent": parent}
print("made")
# pp(new_FS)
# print("----")
# for pwd, directory in new_FS.items():
# print(pwd, "\t", directory['parent'])
print(new_FS.keys())
print("keys^")
for pwd, directory in new_FS.items():
parent = directory["parent"]
if parent:
print(parent)
# print(f"{pwd}:{parent} Adding {directory['size']} to fullsize {new_FS[parent]['full_size']}")
new_FS[parent]["size"] += directory["size"]
print("added sizes")
sizes = []
for k, v in new_FS.items():
sizes.append(v["size"])
total = 0
for size in sizes:
if size <= 100000:
print("+", size)
total += size
print("=", total)
def build_fs(rows):
LS_ING = False
for row in rows:
parts = row.split(" ")
if parts[0] == "$":
if LS_ING:
LS_ING = False
# Action
if parts[1] == "cd":
if parts[2] == "..":
PWD.pop()
else:
PWD.append(parts[2])
# print(PWD)
elif parts[1] == "ls":
LS_ING = True
continue
if LS_ING:
if parts[0] == "dir":
add_directory(parts[1])
else:
add_file(parts[1], int(parts[0]))
jp(FS)
def jp(d):
output = json.dumps(FS, indent=4)
output2 = re.sub(r'": \[\s+', '": [', output)
output3 = re.sub(r'",\s+', '", ', output2)
output4 = re.sub(r'"\s+\]', '"]', output3)
print(output4)
def add_directory(dirname):
temp_new_path = PWD + [dirname]
setInDict(temp_new_path, {".": {"size": 0, "files": []}})
def add_file(filename, size):
# print(".", PWD, filename, size)
mapList = PWD + ["."]
addInDict(mapList, filename, size)
curr = getFromDict(mapList[:-1])
print(curr)
# print(curr)
s = curr["."]
s["size"] += size
print(size, s)
tmp = mapList + ["size"]
setInDict(mapList, s)
print("-----")
def part2(row):
pass
def main():
rows = load_rows(7)
part1(rows)
part2(rows)
if __name__ == "__main__":
main()