Skip to content

Commit 0648470

Browse files
committed
2024_05 refactor
1 parent 34d9a58 commit 0648470

File tree

2 files changed

+39
-47
lines changed

2 files changed

+39
-47
lines changed

src/bin/2024_05/main.rs

Lines changed: 38 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,52 @@
11
use aoc::{common, io};
22

3+
fn first_unordered_index(sequence: &[usize], page_orderings: &[[usize; 2]]) -> Option<usize> {
4+
let unordered_indices: Vec<usize> = sequence
5+
.windows(2)
6+
.enumerate()
7+
.filter(|(_, x)| !page_orderings.contains(&[x[0], x[1]]))
8+
.map(|(i, _)| i)
9+
.collect();
10+
11+
unordered_indices.first().copied()
12+
}
13+
314
// Only works when the input page_orderings have ALL NxN relationships / or all relationships
415
// that occur in the page_sequences. Otherwise all transitive relationships, such as A->C
516
// given A->B and B->C should be additionally added to the page_orderings to make this algorithm work.
617
fn solve<const PART: usize>(input: &str) -> usize {
7-
let mut page_orderings: Vec<(usize, usize)> = Vec::new();
8-
let mut page_sequences: Vec<Vec<usize>> = Vec::new();
9-
10-
for line in input.lines() {
11-
if line.is_empty() {
12-
continue;
18+
let batches = io::line_batches(input);
19+
let page_orderings: Vec<[usize; 2]> = batches[0].iter().fold(vec![], |mut acc, x| {
20+
if let Some((page1, page2)) = x.split_once('|') {
21+
acc.push([io::parse_num(page1), io::parse_num(page2)]);
1322
}
14-
if line.chars().any(|x| x == '|') {
15-
let page_nums: Vec<usize> = io::tokenize_nums(line, "|");
16-
page_orderings.push((page_nums[0], page_nums[1]));
17-
} else {
18-
let seq: Vec<usize> = io::tokenize_nums(line, ",");
19-
page_sequences.push(seq);
20-
}
21-
}
23+
acc
24+
});
25+
let page_sequences: Vec<Vec<usize>> = batches[1].iter().fold(vec![], |mut acc, x| {
26+
acc.push(io::tokenize_nums(x, ","));
27+
acc
28+
});
2229

23-
let mut ans = 0;
24-
for seq in page_sequences {
25-
let l = seq.len();
26-
27-
let mut ordered = true;
28-
for i in 1..l {
29-
if !page_orderings.contains(&(seq[i - 1], seq[i])) {
30-
ordered = false;
31-
}
32-
}
33-
34-
if ordered {
35-
if PART == 1 {
36-
ans += seq[l / 2];
37-
}
38-
} else if PART == 2 {
39-
let mut new_seq = seq.clone();
40-
while !ordered {
41-
ordered = true;
42-
for i in 1..l {
43-
if !page_orderings.contains(&(new_seq[i - 1], new_seq[i])) {
44-
new_seq.swap(i - 1, i);
45-
ordered = false;
46-
break;
47-
}
30+
page_sequences
31+
.iter()
32+
.map(|seq| {
33+
if first_unordered_index(seq, &page_orderings).is_none() {
34+
if PART == 1 {
35+
seq[seq.len() / 2]
36+
} else {
37+
0
4838
}
49-
50-
if ordered {
51-
ans += new_seq[l / 2];
39+
} else if PART == 2 {
40+
let mut new_seq = seq.clone();
41+
while let Some(unordered_index) = first_unordered_index(&new_seq, &page_orderings) {
42+
new_seq.swap(unordered_index, unordered_index + 1);
5243
}
44+
new_seq[seq.len() / 2]
45+
} else {
46+
0
5347
}
54-
}
55-
}
56-
57-
ans
48+
})
49+
.sum()
5850
}
5951

6052
fn main() {

src/io.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ where
3434
.filter(|x| x.is_ascii_digit() || *x == '-')
3535
.collect::<String>()
3636
.parse::<T>()
37-
.unwrap()
37+
.expect("Could not parse number.")
3838
}
3939

4040
#[must_use]

0 commit comments

Comments
 (0)