Skip to content

Commit 5a91ed4

Browse files
committed
day 09
1 parent 7c4c87b commit 5a91ed4

File tree

5 files changed

+117
-0
lines changed

5 files changed

+117
-0
lines changed

2024/09/.gitkeep

Whitespace-only changes.

2024/09/diskmap.input

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2333133121414131402

2024/09/leodev.v

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
import os
2+
3+
fn main() {
4+
line := os.read_file('diskmap.input')!
5+
6+
mut layout := []int{}
7+
for i := 0; i < line.len; i += 2 {
8+
file_len := line[i] - `0`
9+
for _ in 0 .. file_len {
10+
layout << (i >> 1)
11+
}
12+
13+
if i + 1 >= line.len {
14+
break
15+
}
16+
gap_len := line[i + 1] - `0`
17+
for _ in 0 .. gap_len {
18+
layout << -1
19+
}
20+
}
21+
22+
print_layout(layout)
23+
24+
mut l := 0
25+
mut r := layout.len - 1
26+
mut fragment := layout.clone()
27+
for {
28+
for fragment[l] != -1 {
29+
l++
30+
}
31+
for fragment[r] == -1 {
32+
r--
33+
}
34+
if l >= r {
35+
break
36+
}
37+
fragment[l] = fragment[r]
38+
fragment[r] = -1
39+
}
40+
41+
print_layout(fragment)
42+
43+
println('part1: ${checksum(fragment)}')
44+
45+
mut compact := layout.clone()
46+
r = compact.len - 1
47+
outer: for {
48+
for r > 0 && compact[r] == -1 {
49+
r--
50+
}
51+
l = r
52+
file_type := compact[r] or { panic('impossible') }
53+
for l > 0 && compact[l - 1] == file_type {
54+
l--
55+
}
56+
if l == 0 {
57+
break
58+
}
59+
file_len := r - l + 1
60+
61+
mut fl := 0
62+
for {
63+
for fl < compact.len && compact[fl] != -1 {
64+
fl++
65+
}
66+
mut fr := fl
67+
for fr < compact.len && compact[fr] == -1 {
68+
fr++
69+
}
70+
if fr > l {
71+
r = l - 1
72+
continue outer
73+
}
74+
available := fr - fl
75+
if available >= file_len {
76+
break
77+
}
78+
fl = fr
79+
}
80+
81+
for i in 0 .. file_len {
82+
compact[fl + i] = compact[r]
83+
compact[l + i] = -1
84+
}
85+
}
86+
87+
print_layout(compact)
88+
89+
println('part2: ${checksum(compact)}')
90+
}
91+
92+
fn print_layout(layout []int) {
93+
for value in layout {
94+
if value != -1 {
95+
print(value)
96+
} else {
97+
print('.')
98+
}
99+
}
100+
print('\n')
101+
}
102+
103+
fn checksum(layout []int) i64 {
104+
mut total := i64(0)
105+
for i, value in layout {
106+
if value != -1 {
107+
total += value * i
108+
}
109+
}
110+
return total
111+
}

known/2024/09/.gitkeep

Whitespace-only changes.

known/2024/09/leodev.out

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
00...111...2...333.44.5555.6666.777.888899
2+
0099811188827773336446555566..............
3+
part1: 1928
4+
00992111777.44.333....5555.6666.....8888..
5+
part2: 2858

0 commit comments

Comments
 (0)