Skip to content

Commit 2bb9178

Browse files
authored
leodev, day 09 (#66)
1 parent fd41979 commit 2bb9178

File tree

5 files changed

+116
-0
lines changed

5 files changed

+116
-0
lines changed

2024/09/.gitkeep

Whitespace-only changes.

2024/09/diskmap.input

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2333133121414131402

2024/09/leodev.v

+110
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
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+
for l > 0 && compact[l - 1] == compact[r] {
53+
l--
54+
}
55+
if l == 0 {
56+
break
57+
}
58+
file_len := r - l + 1
59+
60+
mut fl := 0
61+
for {
62+
for fl < compact.len && compact[fl] != -1 {
63+
fl++
64+
}
65+
mut fr := fl
66+
for fr < compact.len && compact[fr] == -1 {
67+
fr++
68+
}
69+
if fr > l {
70+
r = l - 1
71+
continue outer
72+
}
73+
available := fr - fl
74+
if available >= file_len {
75+
break
76+
}
77+
fl = fr
78+
}
79+
80+
for i in 0 .. file_len {
81+
compact[fl + i] = compact[r]
82+
compact[l + i] = -1
83+
}
84+
}
85+
86+
print_layout(compact)
87+
88+
println('part2: ${checksum(compact)}')
89+
}
90+
91+
fn print_layout(layout []int) {
92+
for value in layout {
93+
if value != -1 {
94+
print(value)
95+
} else {
96+
print('.')
97+
}
98+
}
99+
print('\n')
100+
}
101+
102+
fn checksum(layout []int) i64 {
103+
mut total := i64(0)
104+
for i, value in layout {
105+
if value != -1 {
106+
total += value * i
107+
}
108+
}
109+
return total
110+
}

known/2024/09/.gitkeep

Whitespace-only changes.

known/2024/09/leodev.out

+5
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)