day07
This commit is contained in:
parent
826ead8602
commit
d9c022a955
1108
07/input.txt
Normal file
1108
07/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
23
07/input_sample.txt
Normal file
23
07/input_sample.txt
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
|
40
07/solve01.py
Normal file
40
07/solve01.py
Normal 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
43
07/solve02.py
Normal 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]))
|
Loading…
x
Reference in New Issue
Block a user