day7
This commit is contained in:
parent
d0c985a686
commit
4cd0424218
91
day07.py
Normal file
91
day07.py
Normal file
@ -0,0 +1,91 @@
|
||||
from collections import deque
|
||||
from tools.aoc import AOCDay
|
||||
from typing import Any
|
||||
|
||||
|
||||
class File:
|
||||
def __init__(self, name: str, size: int):
|
||||
self.name = name
|
||||
self.size = size
|
||||
|
||||
|
||||
class Dir:
|
||||
def __init__(self, name: str, parent: 'Dir' = None):
|
||||
self.name = name
|
||||
self.parent = parent
|
||||
self.dirs = []
|
||||
self.files = []
|
||||
|
||||
def getSize(self):
|
||||
files = sum(x.size for x in self.files)
|
||||
return files + sum(x.getSize() for x in self.dirs)
|
||||
|
||||
|
||||
class Day(AOCDay):
|
||||
inputs = [
|
||||
[
|
||||
(95437, "input7_test"),
|
||||
(1367870, "input7"),
|
||||
],
|
||||
[
|
||||
(24933642, "input7_test"),
|
||||
(549173, "input7"),
|
||||
]
|
||||
]
|
||||
|
||||
def get_dir_struct(self) -> Dir:
|
||||
current_dir = None
|
||||
for line in self.getInput():
|
||||
if line.startswith("$"): # command
|
||||
cmd = line[2:].split(" ")
|
||||
if cmd[0] == 'cd':
|
||||
if cmd[1] == "..":
|
||||
current_dir = current_dir.parent
|
||||
else:
|
||||
current_dir = Dir(cmd[1], current_dir)
|
||||
if current_dir.parent is not None:
|
||||
current_dir.parent.dirs.append(current_dir)
|
||||
|
||||
continue
|
||||
|
||||
file = line.split(" ")
|
||||
if file[0] != 'dir':
|
||||
file_size = int(file[0])
|
||||
current_dir.files.append(File(file[1], file_size))
|
||||
|
||||
while current_dir.parent:
|
||||
current_dir = current_dir.parent
|
||||
|
||||
return current_dir
|
||||
|
||||
def get_sizes(self) -> (int, int):
|
||||
root = self.get_dir_struct()
|
||||
need_free = 30_000_000 - (70_000_000 - root.getSize())
|
||||
smallest = 1e20
|
||||
queue = deque()
|
||||
queue.append(root)
|
||||
sum_size = 0
|
||||
while queue:
|
||||
current_dir = queue.popleft()
|
||||
dir_size = current_dir.getSize()
|
||||
if dir_size <= 100_000:
|
||||
sum_size += dir_size
|
||||
if need_free <= dir_size < smallest:
|
||||
smallest = dir_size
|
||||
for sub_dir in current_dir.dirs:
|
||||
queue.append(sub_dir)
|
||||
|
||||
return sum_size, smallest
|
||||
|
||||
def part1(self) -> Any:
|
||||
ret, _ = self.get_sizes()
|
||||
return ret
|
||||
|
||||
def part2(self) -> Any:
|
||||
_, ret = self.get_sizes()
|
||||
return ret
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
day = Day(2022, 7)
|
||||
day.run(verbose=True)
|
||||
1030
inputs/input7
Normal file
1030
inputs/input7
Normal file
File diff suppressed because it is too large
Load Diff
23
inputs/input7_test
Normal file
23
inputs/input7_test
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
|
||||
Loading…
Reference in New Issue
Block a user