Skip to content

Commit 2a4db83

Browse files
committed
Refactor similar to Day 13
1 parent 884dd14 commit 2a4db83

File tree

1 file changed

+28
-22
lines changed

1 file changed

+28
-22
lines changed

src/year2015/day09.rs

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,43 +27,49 @@ type Result = (u32, u32);
2727

2828
pub fn parse(input: &str) -> Result {
2929
let tokens: Vec<_> = input.split_ascii_whitespace().chunk::<5>().collect();
30-
3130
let mut indices = FastMap::new();
31+
3232
for [start, _, end, ..] in &tokens {
33-
if !indices.contains_key(start) {
34-
indices.insert(start, indices.len());
35-
}
36-
if !indices.contains_key(end) {
37-
indices.insert(end, indices.len());
38-
}
33+
let size = indices.len();
34+
indices.entry(start).or_insert(size);
35+
36+
let size = indices.len();
37+
indices.entry(end).or_insert(size);
3938
}
4039

4140
let stride = indices.len();
42-
let mut distances = vec![0_u32; stride * stride];
41+
let mut distances = vec![0; stride * stride];
42+
4343
for [start, _, end, _, distance] in &tokens {
4444
let start = indices[start];
4545
let end = indices[end];
4646
let distance = distance.unsigned();
47+
4748
distances[stride * start + end] = distance;
4849
distances[stride * end + start] = distance;
4950
}
5051

5152
let mut global_min = u32::MAX;
5253
let mut global_max = u32::MIN;
53-
let mut middle: Vec<_> = (1..stride).collect();
54-
55-
middle.permutations(|slice| {
56-
let first = distances[slice[0]];
57-
let last = distances[slice[stride - 2]];
58-
let mut sum = first + last;
59-
let mut local_min = first.min(last);
60-
let mut local_max = first.max(last);
61-
62-
for w in slice.windows(2) {
63-
let trip = distances[stride * w[0] + w[1]];
64-
sum += trip;
65-
local_min = local_min.min(trip);
66-
local_max = local_max.max(trip);
54+
let mut indices: Vec<_> = (1..stride).collect();
55+
56+
indices.permutations(|slice| {
57+
let mut sum = 0;
58+
let mut local_min = u32::MAX;
59+
let mut local_max = u32::MIN;
60+
61+
let mut trip = |from, to| {
62+
let distance = distances[stride * from + to];
63+
sum += distance;
64+
local_min = local_min.min(distance);
65+
local_max = local_max.max(distance);
66+
};
67+
68+
trip(0, slice[0]);
69+
trip(0, slice[slice.len() - 1]);
70+
71+
for i in 1..slice.len() {
72+
trip(slice[i], slice[i - 1]);
6773
}
6874

6975
global_min = global_min.min(sum - local_max);

0 commit comments

Comments
 (0)