154 lines
3.8 KiB
Python
154 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()
|