This commit is contained in:
Peter Hudec 2022-12-07 23:49:28 +01:00
parent 826ead8602
commit d9c022a955
4 changed files with 1214 additions and 0 deletions

1108
07/input.txt Normal file

File diff suppressed because it is too large Load Diff

23
07/input_sample.txt Normal file
View 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

40
07/solve01.py Normal file
View File

@ -0,0 +1,40 @@
#/usr/bin/env python
from collections import defaultdict
import re
RE_CMD = re.compile(r"^\$ (ls|cd)(.*)$")
RE_LS_DIR = re.compile(r"^dir (.*)$")
RE_LS_FILE = re.compile(r"^(\d+) (.*)$")
sizes = defaultdict(int)
size_max = 100000
dir_cur = "/"
with open("input.txt", "r") as f:
for line in f:
line = line.strip()
m = RE_LS_FILE.match(line)
if m:
sizes[dir_cur] += int(m.group(1))
continue
m = RE_CMD.match(line)
if m and m.group(1) == 'cd':
cd_args = m.group(2).strip()
if cd_args == '..':
dir_cur = "/".join(dir_cur.split("/")[:-2])+"/"
elif cd_args == "/":
dir_cur = "/"
else:
dir_cur += cd_args + "/"
continue
#not very optimal ;( recursion and tree build will be faster
sizes_total = defaultdict(int)
for dir in (sorted(sizes.keys(), key=len, reverse=True)):
tokens = dir.split("/")[:-1]
for i in range(1, len(tokens)+1):
x = "/".join(tokens[:i])+"/"
sizes_total[x] += sizes[dir]
print(sum([x for x in sizes_total.values() if x <= size_max]))

43
07/solve02.py Normal file
View File

@ -0,0 +1,43 @@
#/usr/bin/env python
from collections import defaultdict
import re
RE_CMD = re.compile(r"^\$ (ls|cd)(.*)$")
RE_LS_DIR = re.compile(r"^dir (.*)$")
RE_LS_FILE = re.compile(r"^(\d+) (.*)$")
sizes = defaultdict(int)
dir_cur = "/"
size_unused = 30000000
size_total = 70000000
with open("input.txt", "r") as f:
for line in f:
line = line.strip()
m = RE_LS_FILE.match(line)
if m:
sizes[dir_cur] += int(m.group(1))
continue
m = RE_CMD.match(line)
if m and m.group(1) == 'cd':
cd_args = m.group(2).strip()
if cd_args == '..':
dir_cur = "/".join(dir_cur.split("/")[:-2])+"/"
elif cd_args == "/":
dir_cur = "/"
else:
dir_cur += cd_args + "/"
continue
#not very optimal ;( recursion and tree build will be faster
sizes_total = defaultdict(int)
for dir in (sorted(sizes.keys(), key=len, reverse=True)):
tokens = dir.split("/")[:-1]
for i in range(1, len(tokens)+1):
x = "/".join(tokens[:i])+"/"
sizes_total[x] += sizes[dir]
size_required = size_unused - (size_total - sizes_total["/"])
print(min([x for x in sizes_total.values() if x >= size_required]))