Skip to content

Commit afb6396

Browse files
committed
Day 03 a bit of refactoring
1 parent f591f7c commit afb6396

1 file changed

Lines changed: 28 additions & 19 deletions

File tree

aoc-solver/src/y2025/day03.rs

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,31 @@ fn parse(input: &str) -> Result<Vec<Vec<u32>>, AocError> {
1919
.collect()
2020
}
2121

22-
fn find_max_joltage(banks: &[u32], digits: usize) -> u64 {
22+
fn find_max_joltage(banks: &[u32], digits: usize) -> Option<u64> {
23+
if digits > banks.len() {
24+
return None;
25+
}
26+
2327
let mut skip = 0;
2428
let mut result = 0;
2529

26-
for digit in 0..digits {
27-
let digit_pos = digits - digit - 1;
28-
let take = banks.len() - skip - digit_pos;
30+
for i in 0..digits {
31+
let remaining = digits - i;
32+
let end = banks.len() - (remaining - 1);
33+
let slice = &banks[skip..end];
2934

30-
let mut banks_to_check = banks.iter().skip(skip).take(take);
31-
let max = banks_to_check.clone().max().unwrap();
35+
let (offset, &max) = slice
36+
.iter()
37+
.enumerate()
38+
// max_by_key returns the last element
39+
.rev()
40+
.max_by_key(|&(_, v)| v)?;
3241

33-
skip += banks_to_check.position(|battery| battery == max).unwrap() + 1;
34-
result += 10u64.pow(digit_pos as u32) * *max as u64
42+
skip += offset + 1;
43+
result = result * 10 + max as u64;
3544
}
3645

37-
result
46+
Some(result)
3847
}
3948

4049
impl Solution for Day03 {
@@ -48,7 +57,7 @@ impl Solution for Day03 {
4857
fn part_1(&self, input: &str) -> Result<u64, AocError> {
4958
let total = parse(input)?
5059
.iter()
51-
.map(|bank| find_max_joltage(bank, 2))
60+
.flat_map(|bank| find_max_joltage(bank, 2))
5261
.sum();
5362

5463
Ok(total)
@@ -57,7 +66,7 @@ impl Solution for Day03 {
5766
fn part_2(&self, input: &str) -> Result<u64, AocError> {
5867
let total = parse(input)?
5968
.iter()
60-
.map(|bank| find_max_joltage(bank, 12))
69+
.flat_map(|bank| find_max_joltage(bank, 12))
6170
.sum();
6271

6372
Ok(total)
@@ -72,63 +81,63 @@ mod tests {
7281
fn it_finds_max_joltage_1() {
7382
assert_eq!(
7483
find_max_joltage(&[9, 8, 7, 6, 5, 4, 3, 2, 1, 1, 1, 1, 1, 1, 1], 2),
75-
98
84+
Some(98)
7685
);
7786
}
7887

7988
#[test]
8089
fn it_finds_max_joltage_2() {
8190
assert_eq!(
8291
find_max_joltage(&[8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9], 2),
83-
89
92+
Some(89)
8493
)
8594
}
8695

8796
#[test]
8897
fn it_finds_max_joltage_3() {
8998
assert_eq!(
9099
find_max_joltage(&[2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 7, 8], 2),
91-
78
100+
Some(78)
92101
)
93102
}
94103

95104
#[test]
96105
fn it_finds_max_joltage_4() {
97106
assert_eq!(
98107
find_max_joltage(&[8, 1, 8, 1, 8, 1, 9, 1, 1, 1, 1, 2, 1, 1, 1], 2),
99-
92
108+
Some(92)
100109
)
101110
}
102111

103112
#[test]
104113
fn it_finds_max_joltage_5() {
105114
assert_eq!(
106115
find_max_joltage(&[9, 8, 7, 6, 5, 4, 3, 2, 1, 1, 1, 1, 1, 1, 1], 12),
107-
987654321111
116+
Some(987654321111)
108117
);
109118
}
110119

111120
#[test]
112121
fn it_finds_max_joltage_6() {
113122
assert_eq!(
114123
find_max_joltage(&[8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9], 12),
115-
811111111119
124+
Some(811111111119)
116125
);
117126
}
118127

119128
#[test]
120129
fn it_finds_max_joltage_7() {
121130
assert_eq!(
122131
find_max_joltage(&[2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 7, 8], 12),
123-
434234234278
132+
Some(434234234278)
124133
);
125134
}
126135

127136
#[test]
128137
fn it_finds_max_joltage_8() {
129138
assert_eq!(
130139
find_max_joltage(&[8, 1, 8, 1, 8, 1, 9, 1, 1, 1, 1, 2, 1, 1, 1], 12),
131-
888911112111
140+
Some(888911112111)
132141
);
133142
}
134143

0 commit comments

Comments
 (0)