Skip to content

Commit 115581f

Browse files
committed
Solve 2022 Day 7 in python
1 parent 25e258a commit 115581f

File tree

1 file changed

+89
-0
lines changed

1 file changed

+89
-0
lines changed

2022/Day7/python/solve.py

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import os
2+
import re
3+
4+
dirs = {}
5+
current_dir = "/"
6+
7+
def eval_command(command: str, output: list[str]):
8+
global dirs, current_dir
9+
if command.startswith('cd'):
10+
path = command.split(' ')[1]
11+
current_dir = os.path.abspath(os.path.join(current_dir, path))
12+
if dirs.get(current_dir) == None:
13+
dirs[current_dir] = {}
14+
if command == 'ls':
15+
for line in output:
16+
if re.compile('\d+').match(line):
17+
size = int(line.split(' ')[0])
18+
filename = line.split(' ')[1]
19+
dirs[current_dir][filename] = size
20+
21+
22+
pass
23+
24+
def calculate_dir_sizes(lines):
25+
i = 0
26+
while len(lines) > i:
27+
line = lines[i]
28+
if line.startswith('$'):
29+
command = line.split('$ ')[1].replace("\n", "");
30+
i += 1
31+
output = []
32+
while len(lines) > i:
33+
if lines[i].startswith('$'): break
34+
output.append(lines[i].replace('\n', ''))
35+
i += 1
36+
eval_command(command, output)
37+
38+
dir_sizes = {}
39+
40+
for path in dirs:
41+
subpaths = []
42+
filesize = 0
43+
for pathb in dirs:
44+
if pathb.startswith(path):
45+
subpaths.append(pathb)
46+
for subpath in subpaths:
47+
files = dirs[subpath]
48+
for file in files:
49+
filesize += int(files[file])
50+
dir_sizes[path] = filesize
51+
return dir_sizes
52+
53+
def part1(lines: list[str]):
54+
dir_sizes = calculate_dir_sizes(lines)
55+
56+
small_dirs = {}
57+
58+
for filepath in dir_sizes:
59+
if dir_sizes[filepath] < 100000:
60+
small_dirs[filepath] = dir_sizes[filepath]
61+
62+
size_sum = 0
63+
for filepath in small_dirs:
64+
size_sum += small_dirs[filepath]
65+
return size_sum
66+
67+
68+
def part2(lines):
69+
dir_sizes = calculate_dir_sizes(lines)
70+
min_size = 30000000
71+
used = 70000000 - dir_sizes['/']
72+
needed = min_size - used
73+
smallest = dir_sizes['/']
74+
75+
for filepath in dir_sizes:
76+
size = dir_sizes[filepath]
77+
if size < smallest and size > needed:
78+
smallest = dir_sizes[filepath]
79+
80+
return smallest
81+
82+
83+
dirname = os.path.dirname(__file__)
84+
filename = os.path.join(dirname, '../input.txt')
85+
with open(filename) as f:
86+
lines = f.readlines()
87+
88+
print(part1(lines))
89+
print(part2(lines))

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy