[py] Solve 2022_07
This commit is contained in:
parent
dd5cf6019d
commit
378b5e38ae
2 changed files with 45 additions and 1 deletions
|
|
@ -8,7 +8,7 @@ from .y2017 import d01, d02, d03, d04, d05, d06, d07, d08, d09
|
||||||
from .y2018 import d01, d02, d03, d04, d05, d06, d07, d08, d09, d10, d11
|
from .y2018 import d01, d02, d03, d04, d05, d06, d07, d08, d09, d10, d11
|
||||||
from .y2020 import d10
|
from .y2020 import d10
|
||||||
from .y2021 import d14
|
from .y2021 import d14
|
||||||
from .y2022 import d01, d02, d03, d04, d05, d06
|
from .y2022 import d01, d02, d03, d04, d05, d06, d07
|
||||||
|
|
||||||
DAYS = {
|
DAYS = {
|
||||||
"2015_01": y2015.d01.solve,
|
"2015_01": y2015.d01.solve,
|
||||||
|
|
@ -49,6 +49,7 @@ DAYS = {
|
||||||
"2022_04": y2022.d04.solve,
|
"2022_04": y2022.d04.solve,
|
||||||
"2022_05": y2022.d05.solve,
|
"2022_05": y2022.d05.solve,
|
||||||
"2022_06": y2022.d06.solve,
|
"2022_06": y2022.d06.solve,
|
||||||
|
"2022_07": y2022.d07.solve,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
43
py/aoc/y2022/d07.py
Normal file
43
py/aoc/y2022/d07.py
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
def at(fs, path):
|
||||||
|
for segment in path:
|
||||||
|
fs = fs[segment]
|
||||||
|
return fs
|
||||||
|
|
||||||
|
|
||||||
|
def calc_size(fs):
|
||||||
|
if isinstance(fs, dict):
|
||||||
|
return sum(calc_size(child) for child in fs.values())
|
||||||
|
return fs
|
||||||
|
|
||||||
|
|
||||||
|
def dict_sizes(fs):
|
||||||
|
result = []
|
||||||
|
if isinstance(fs, dict):
|
||||||
|
result.append(calc_size(fs))
|
||||||
|
for child in fs.values():
|
||||||
|
result.extend(dict_sizes(child))
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def solve(inputstr):
|
||||||
|
fs = {}
|
||||||
|
path = []
|
||||||
|
for line in inputstr.splitlines():
|
||||||
|
if line == "$ cd /":
|
||||||
|
path = []
|
||||||
|
elif line == "$ cd ..":
|
||||||
|
path.pop()
|
||||||
|
elif line[:5] == "$ cd ":
|
||||||
|
path.append(line[5:])
|
||||||
|
elif line == "$ ls":
|
||||||
|
pass
|
||||||
|
elif line[:4] == "dir ":
|
||||||
|
at(fs, path)[line[4:]] = {}
|
||||||
|
else:
|
||||||
|
size, name = line.split()
|
||||||
|
at(fs, path)[name] = int(size)
|
||||||
|
|
||||||
|
sizes = dict_sizes(fs)
|
||||||
|
print("Part 1:", sum(size for size in sizes if size <= 100000))
|
||||||
|
min_size = calc_size(fs) - 40000000
|
||||||
|
print(f"Part 2:", min(size for size in sizes if size >= min_size))
|
||||||
Loading…
Add table
Add a link
Reference in a new issue