tangled
alpha
login
or
join now
nove.dev
/
aoc-2025
1
fork
atom
:)
1
fork
atom
overview
issues
pulls
pipelines
deduping
nove.dev
3 months ago
09551cce
a81a2ce7
+13
-28
1 changed file
expand all
collapse all
unified
split
src
day3.rs
+13
-28
src/day3.rs
···
1
1
pub fn day3_part1(input: &str) -> String {
2
2
let batteries = parse(input);
3
3
-
let sum: u64 = batteries.iter().map(|bank| max_joltage(bank)).sum();
3
3
+
let sum: u64 = batteries.iter().map(|bank| max_joltage(bank, 2)).sum();
4
4
sum.to_string()
5
5
}
6
6
pub fn day3_part2(input: &str) -> String {
7
7
let batteries = parse(input);
8
8
-
let sum: u64 = batteries.iter().map(|bank| max_12_joltage(bank)).sum();
8
8
+
let sum: u64 = batteries.iter().map(|bank| max_joltage(bank, 12)).sum();
9
9
sum.to_string()
10
10
}
11
11
12
12
-
fn max_12_joltage(bank: &[u64]) -> u64 {
12
12
+
fn max_joltage(bank: &[u8], battery_count: usize) -> u64 {
13
13
let bank_length = bank.len();
14
14
-
let mut digits = Vec::with_capacity(12);
14
14
+
let mut digits = Vec::with_capacity(battery_count);
15
15
let mut cursor = 0;
16
16
-
for place in 0..12 {
17
17
-
let max_digit = bank[cursor..bank_length - (12 - (place + 1))]
18
18
-
.iter()
19
19
-
.max()
20
20
-
.unwrap();
21
21
-
let index_of_max_digit = bank[cursor..bank_length - (12 - (place + 1))]
16
16
+
for place in 0..battery_count {
17
17
+
let range = cursor..bank_length - (battery_count - (place + 1));
18
18
+
let (index_of_max_digit, max_digit) = bank[range]
22
19
.iter()
23
20
.enumerate()
24
24
-
.find(|(_, digit)| *digit == max_digit)
25
25
-
.unwrap()
26
26
-
.0;
21
21
+
.max_by_key(|(index, digit)| (*digit, bank_length - index))
22
22
+
.unwrap();
27
23
cursor = index_of_max_digit + cursor + 1;
28
24
digits.push(max_digit)
29
25
}
30
26
31
31
-
digits.into_iter().fold(0, |acc, digit| acc * 10 + digit)
32
32
-
}
33
33
-
34
34
-
fn max_joltage(bank: &[u64]) -> u64 {
35
35
-
let bank_length = bank.len();
36
36
-
let max_digit_not_final = bank[..bank_length - 1].iter().max().unwrap();
37
37
-
let index_of_max_digit = bank
27
27
+
digits
38
28
.iter()
39
39
-
.enumerate()
40
40
-
.find(|(_, digit)| *digit == max_digit_not_final)
41
41
-
.unwrap()
42
42
-
.0;
43
43
-
let max_ones = bank[index_of_max_digit + 1..].iter().max().unwrap();
44
44
-
*max_digit_not_final * 10 + max_ones
29
29
+
.fold(0, |acc, &&digit| acc * 10 + digit as u64)
45
30
}
46
31
47
47
-
fn parse(input: &str) -> Vec<Vec<u64>> {
32
32
+
fn parse(input: &str) -> Vec<Vec<u8>> {
48
33
input
49
34
.lines()
50
35
.map(|bank| {
51
36
bank.chars()
52
52
-
.map(|c| c.to_digit(10).unwrap() as u64)
37
37
+
.map(|c| c.to_digit(10).unwrap() as u8)
53
38
.collect()
54
39
})
55
40
.collect()