Skip to content

Commit c811486

Browse files
committed
2024: Day 9 - part 1
1 parent 36c5247 commit c811486

File tree

3 files changed

+96
-0
lines changed

3 files changed

+96
-0
lines changed

2024/python/day9/__init__.py

Whitespace-only changes.

2024/python/day9/__main__.py

+95
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
from math import floor
2+
from collections import OrderedDict
3+
4+
5+
from utils.file import read_input
6+
7+
disk_map = list(map(int, read_input(__package__)[0]))
8+
9+
def p1() -> int:
10+
uncompressed_disk_map: list[str] = []
11+
for i in range(floor((len(disk_map) + 1) / 2)):
12+
occupied = disk_map[i * 2]
13+
for _ in range(occupied):
14+
uncompressed_disk_map.append(str(i))
15+
try:
16+
free = disk_map[i * 2 + 1]
17+
for _ in range(free):
18+
uncompressed_disk_map.append(".")
19+
except IndexError:
20+
pass
21+
22+
size = len(uncompressed_disk_map)
23+
if size < 100:
24+
print("".join(uncompressed_disk_map))
25+
26+
27+
while True:
28+
free_space = next(i for i in range(size) if uncompressed_disk_map[i] == ".")
29+
last_character = next(size - i for i in range(1, size) if uncompressed_disk_map[size - i].isdigit())
30+
if free_space > last_character:
31+
break
32+
uncompressed_disk_map[free_space], uncompressed_disk_map[last_character] = uncompressed_disk_map[last_character], uncompressed_disk_map[free_space]
33+
34+
return sum(
35+
i * int(n)
36+
for i, n in enumerate(uncompressed_disk_map)
37+
if n != "."
38+
)
39+
40+
def p2() -> int:
41+
files = OrderedDict({
42+
i: disk_map[i * 2]
43+
for i in range(floor((len(disk_map) + 1) / 2))
44+
})
45+
46+
reordered: list[tuple[int, int]] = []
47+
for i in range(floor((len(disk_map) + 1) / 2)):
48+
try:
49+
free = disk_map[i * 2 + 1]
50+
except IndexError:
51+
free = 0
52+
if i in files.keys():
53+
reordered.append((i, files[i]))
54+
del files[i]
55+
if not files:
56+
break
57+
else:
58+
reordered.append((-1, disk_map[i * 2]))
59+
60+
while free > 0:
61+
n = next((n_ for n_, size in reversed(files.items()) if size <= free), None)
62+
if n is None:
63+
break
64+
consumed = files[n]
65+
reordered.append((n, consumed))
66+
free -= consumed
67+
del files[n]
68+
69+
if not files:
70+
break
71+
72+
if free > 0:
73+
reordered.append((-1, free))
74+
75+
reordered_disk_map = ""
76+
for idx, length in reordered:
77+
if idx == -1:
78+
reordered_disk_map += "." * length
79+
else:
80+
reordered_disk_map += str(idx) * length
81+
82+
if len(reordered_disk_map) < 100:
83+
print(reordered_disk_map)
84+
return sum(
85+
i * int(n)
86+
for i, n in enumerate(reordered_disk_map)
87+
if n != "."
88+
)
89+
90+
91+
#print("Part 1:", p1())
92+
93+
# 84975570147 too low
94+
print("Part 2:", p2())
95+

0 commit comments

Comments
 (0)