Days 7 and 8 completed
This commit is contained in:
71
day7/common.py
Normal file
71
day7/common.py
Normal file
@@ -0,0 +1,71 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import re
|
||||
from dataclasses import dataclass
|
||||
|
||||
|
||||
@dataclass
|
||||
class File:
|
||||
name: str
|
||||
size: int
|
||||
|
||||
def __equals__(self, other):
|
||||
return self.name == other.name and self.size == other.size
|
||||
|
||||
|
||||
@dataclass
|
||||
class Folder:
|
||||
name: str
|
||||
parent: Folder | None
|
||||
children: list[Folder | File]
|
||||
|
||||
def __equals__(self, other):
|
||||
return self.name == other.name and self.parent == other.parent
|
||||
|
||||
@property
|
||||
def full_name(self):
|
||||
if self.parent is None:
|
||||
return "/"
|
||||
else:
|
||||
return self.parent.full_name + f"/{self.name}"
|
||||
|
||||
@property
|
||||
def size(self):
|
||||
return sum(map(lambda x: x.size, self.children))
|
||||
|
||||
def __lt__(self, other):
|
||||
return self.size < other.size
|
||||
|
||||
|
||||
def pretty_print(folder: Folder, depth: int = 0) -> None:
|
||||
print("".join([" " for i in range(depth + 1)]), end="- ")
|
||||
print(f"{folder.name} (dir)")
|
||||
for object in folder.children:
|
||||
if type(object) is Folder:
|
||||
pretty_print(object, depth + 1)
|
||||
else:
|
||||
print("".join([" " for i in range(depth + 2)]), end="- ")
|
||||
print(f"{object.name} (file, size={object.size})")
|
||||
|
||||
|
||||
def parse(filename: str) -> Folder:
|
||||
filesystem = Folder(name="/", parent=None, children=[])
|
||||
with open(filename) as f:
|
||||
f.readline()
|
||||
current = filesystem
|
||||
while line := f.readline()[:-1]:
|
||||
if line[0] == "$":
|
||||
if match := re.match(r"\$ cd (.+)", line):
|
||||
folder_name = match.group(1)
|
||||
if folder_name != "..":
|
||||
current = filter(lambda x: x.name == folder_name, current.children).__next__()
|
||||
else:
|
||||
current = current.parent
|
||||
else:
|
||||
if match := re.match(r"(\d+) ((?:\w|.)+)", line):
|
||||
fichier = File(name=match.group(2), size=int(match.group(1)))
|
||||
current.children.append(fichier)
|
||||
elif match := re.match(r"dir (\w+)", line):
|
||||
folder = Folder(name=match.group(1), parent=current, children=[])
|
||||
current.children.append(folder)
|
||||
return filesystem
|
||||
18
day7/part1.py
Executable file
18
day7/part1.py
Executable file
@@ -0,0 +1,18 @@
|
||||
#!/usr/bin/env python
|
||||
from common import Folder, parse
|
||||
|
||||
|
||||
def solve(folder: Folder) -> int:
|
||||
childrens_sizes = sum(map(lambda x: solve(x), filter(lambda y: type(y) is Folder, folder.children)))
|
||||
if folder.size >= 100000:
|
||||
return childrens_sizes
|
||||
else:
|
||||
return folder.size + childrens_sizes
|
||||
|
||||
|
||||
def main():
|
||||
print(solve(parse("input")))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
25
day7/part2.py
Executable file
25
day7/part2.py
Executable file
@@ -0,0 +1,25 @@
|
||||
#!/usr/bin/env python
|
||||
from common import Folder, parse
|
||||
|
||||
|
||||
def folders_big_enough(folder: Folder, threshold: int) -> list[Folder]:
|
||||
if folder.size < threshold:
|
||||
return []
|
||||
else:
|
||||
folder_list = [folder]
|
||||
for child in filter(lambda x: type(x) is Folder, folder.children):
|
||||
folder_list += folders_big_enough(child, threshold)
|
||||
return folder_list
|
||||
|
||||
|
||||
def solve(folder: Folder) -> int:
|
||||
threshold = 30000000 - (70000000 - folder.size)
|
||||
return min(sorted(folders_big_enough(folder, threshold))).size
|
||||
|
||||
|
||||
def main():
|
||||
print(solve(parse("input")))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
23
day7/toy_input
Normal file
23
day7/toy_input
Normal file
@@ -0,0 +1,23 @@
|
||||
$ cd /
|
||||
$ ls
|
||||
dir a
|
||||
14848514 b.txt
|
||||
8504156 c.dat
|
||||
dir d
|
||||
$ cd a
|
||||
$ ls
|
||||
dir e
|
||||
29116 f
|
||||
2557 g
|
||||
62596 h.lst
|
||||
$ cd e
|
||||
$ ls
|
||||
584 i
|
||||
$ cd ..
|
||||
$ cd ..
|
||||
$ cd d
|
||||
$ ls
|
||||
4060174 j
|
||||
8033020 d.log
|
||||
5626152 d.ext
|
||||
7214296 k
|
||||
Reference in New Issue
Block a user