Skip to content

Commit b7be6f8

Browse files
Jackson Day 5 Part 2 Better Algorithm (#33)
* Jackson Day 4, part 1, part 2 * Initial day 5 * Day 5, Part 1, Part 2 * Delete 2023/04/personal.input * Delete 2023/05/personal.input * Delete 2023/05/jacksonmowry * much better algorithm --------- Co-authored-by: JingerJack <[email protected]>
1 parent 8fd9355 commit b7be6f8

File tree

1 file changed

+29
-12
lines changed

1 file changed

+29
-12
lines changed

2023/05/jacksonmowry.v

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,25 +24,42 @@ fn main() {
2424
println('Part 1: ${arrays.min(seeds)!}')
2525

2626
mut seeds_2 := (input[0][0].split(': ')[1]).split(' ').map(it.u64())
27-
mut part_2_min := max_u64
27+
mut ranges := [][]u64{}
28+
for i := 0; i < seeds_2.len - 1; i += 2 {
29+
ranges << [seeds_2[i], seeds_2[i] + seeds_2[i + 1]]
30+
}
2831
mut maps := [][][]u64{}
2932
for i in 1 .. 8 {
3033
maps << input[i][1..].map(it.split(' ').map(it.u64()))
3134
}
32-
for i := 0; i < seeds_2.len - 1; i += 2 {
33-
end := seeds_2[i] + seeds_2[i + 1] - 1
34-
for start := seeds_2[i]; start <= end; start++ {
35-
mut copy := start
36-
for mapx in maps {
37-
for line in mapx {
38-
if copy >= line[1] && copy < line[1] + line[2] {
39-
copy = line[0] + copy - line[1]
40-
break
35+
for mapx in maps {
36+
mut sub_ranges := [][]u64{}
37+
for ranges.len != 0 {
38+
item := ranges.pop()
39+
start := item[0]
40+
end := item[1]
41+
mut found := false
42+
for line in mapx {
43+
ovs := math.max(start, line[1])
44+
oe := math.min(end, line[1] + line[2])
45+
if ovs < oe {
46+
found = true
47+
sub_ranges << [ovs - line[1] + line[0], oe - line[1] + line[0]]
48+
if ovs > start {
49+
ranges << [start, ovs]
4150
}
51+
if end > oe {
52+
ranges << [oe, end]
53+
}
54+
break
4255
}
4356
}
44-
part_2_min = math.min(part_2_min, copy)
57+
if !found {
58+
sub_ranges << [start, end]
59+
}
4560
}
61+
ranges = sub_ranges.clone()
4662
}
47-
println('Part 2: ${part_2_min}')
63+
smallest := ranges.map(it[0]).sorted()[0]
64+
println('Part 2: ${smallest}')
4865
}

0 commit comments

Comments
 (0)