Skip to content

Commit 17e4fb6

Browse files
committed
chore: add y2025::day_03
1 parent f69df6e commit 17e4fb6

File tree

1 file changed

+64
-4
lines changed

1 file changed

+64
-4
lines changed
Lines changed: 64 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,67 @@
1-
pub fn part_1() -> usize {
2-
0
1+
use std::str::FromStr;
2+
3+
use aoclp::anyhow::anyhow;
4+
use aoclp::solvers_impl::input::safe_get_input_as_many;
5+
use itertools::Itertools;
6+
7+
pub fn part_1() -> u64 {
8+
max_joltage(2)
9+
}
10+
11+
pub fn part_2() -> u64 {
12+
max_joltage(12)
13+
}
14+
15+
fn max_joltage(num_batteries: usize) -> u64 {
16+
input()
17+
.into_iter()
18+
.map(|bank| bank.max_joltage(num_batteries))
19+
.sum()
20+
}
21+
22+
struct Bank {
23+
batteries: Vec<u32>,
24+
}
25+
26+
impl Bank {
27+
fn max_joltage(&self, num_batteries: usize) -> u64 {
28+
let mut max = 0;
29+
let mut count = 0;
30+
let mut pos = 0;
31+
32+
while count < num_batteries {
33+
let (rel_pos, max_d) = self.batteries
34+
[pos..=self.batteries.len() - num_batteries + count]
35+
.iter()
36+
.enumerate()
37+
.fold(None::<(usize, u32)>, |acc, (i, &joltage)| match acc {
38+
None => Some((i, joltage)),
39+
Some((_, acc_joltage)) if joltage > acc_joltage => Some((i, joltage)),
40+
acc => acc,
41+
})
42+
.unwrap();
43+
max = max * 10 + (max_d as u64);
44+
count += 1;
45+
pos += rel_pos + 1;
46+
}
47+
48+
max
49+
}
50+
}
51+
52+
impl FromStr for Bank {
53+
type Err = aoclp::Error;
54+
55+
fn from_str(s: &str) -> Result<Self, Self::Err> {
56+
Ok(Self {
57+
batteries: s
58+
.chars()
59+
.map(|c| c.to_digit(10).ok_or_else(|| anyhow!("wrong digit: {c}")))
60+
.try_collect()?,
61+
})
62+
}
363
}
464

5-
pub fn part_2() -> usize {
6-
0
65+
fn input() -> Vec<Bank> {
66+
safe_get_input_as_many(2025, 3)
767
}

0 commit comments

Comments
 (0)