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
pub fn day3_part1(input: &str) -> String {
2
let batteries = parse(input);
3
-
let sum: u64 = batteries.iter().map(|bank| max_joltage(bank)).sum();
4
sum.to_string()
5
}
6
pub fn day3_part2(input: &str) -> String {
7
let batteries = parse(input);
8
-
let sum: u64 = batteries.iter().map(|bank| max_12_joltage(bank)).sum();
9
sum.to_string()
10
}
11
12
-
fn max_12_joltage(bank: &[u64]) -> u64 {
13
let bank_length = bank.len();
14
-
let mut digits = Vec::with_capacity(12);
15
let mut cursor = 0;
16
-
for place in 0..12 {
17
-
let max_digit = bank[cursor..bank_length - (12 - (place + 1))]
18
-
.iter()
19
-
.max()
20
-
.unwrap();
21
-
let index_of_max_digit = bank[cursor..bank_length - (12 - (place + 1))]
22
.iter()
23
.enumerate()
24
-
.find(|(_, digit)| *digit == max_digit)
25
-
.unwrap()
26
-
.0;
27
cursor = index_of_max_digit + cursor + 1;
28
digits.push(max_digit)
29
}
30
31
-
digits.into_iter().fold(0, |acc, digit| acc * 10 + digit)
32
-
}
33
-
34
-
fn max_joltage(bank: &[u64]) -> u64 {
35
-
let bank_length = bank.len();
36
-
let max_digit_not_final = bank[..bank_length - 1].iter().max().unwrap();
37
-
let index_of_max_digit = bank
38
.iter()
39
-
.enumerate()
40
-
.find(|(_, digit)| *digit == max_digit_not_final)
41
-
.unwrap()
42
-
.0;
43
-
let max_ones = bank[index_of_max_digit + 1..].iter().max().unwrap();
44
-
*max_digit_not_final * 10 + max_ones
45
}
46
47
-
fn parse(input: &str) -> Vec<Vec<u64>> {
48
input
49
.lines()
50
.map(|bank| {
51
bank.chars()
52
-
.map(|c| c.to_digit(10).unwrap() as u64)
53
.collect()
54
})
55
.collect()
···
1
pub fn day3_part1(input: &str) -> String {
2
let batteries = parse(input);
3
+
let sum: u64 = batteries.iter().map(|bank| max_joltage(bank, 2)).sum();
4
sum.to_string()
5
}
6
pub fn day3_part2(input: &str) -> String {
7
let batteries = parse(input);
8
+
let sum: u64 = batteries.iter().map(|bank| max_joltage(bank, 12)).sum();
9
sum.to_string()
10
}
11
12
+
fn max_joltage(bank: &[u8], battery_count: usize) -> u64 {
13
let bank_length = bank.len();
14
+
let mut digits = Vec::with_capacity(battery_count);
15
let mut cursor = 0;
16
+
for place in 0..battery_count {
17
+
let range = cursor..bank_length - (battery_count - (place + 1));
18
+
let (index_of_max_digit, max_digit) = bank[range]
0
0
0
19
.iter()
20
.enumerate()
21
+
.max_by_key(|(index, digit)| (*digit, bank_length - index))
22
+
.unwrap();
0
23
cursor = index_of_max_digit + cursor + 1;
24
digits.push(max_digit)
25
}
26
27
+
digits
0
0
0
0
0
0
28
.iter()
29
+
.fold(0, |acc, &&digit| acc * 10 + digit as u64)
0
0
0
0
0
30
}
31
32
+
fn parse(input: &str) -> Vec<Vec<u8>> {
33
input
34
.lines()
35
.map(|bank| {
36
bank.chars()
37
+
.map(|c| c.to_digit(10).unwrap() as u8)
38
.collect()
39
})
40
.collect()