1use std::mem::replace;
3
4pub fn parse(input: &str) -> Vec<&str> {
5 input.lines().collect()
6}
7
8pub fn part1(input: &[&str]) -> u64 {
9 solve::<2>(input)
10}
11
12pub fn part2(input: &[&str]) -> u64 {
13 solve::<12>(input)
14}
15
16fn solve<const N: usize>(input: &[&str]) -> u64 {
17 let mut batteries = [0; N];
18
19 input
20 .iter()
21 .map(|&bank| {
22 let end = bank.len() - N;
23 batteries.copy_from_slice(&bank.as_bytes()[end..]);
24
25 for mut next in bank[..end].bytes().rev() {
26 for battery in &mut batteries {
27 if next < *battery {
28 break;
29 }
30 next = replace(battery, next);
31 }
32 }
33
34 batteries.iter().fold(0, |joltage, &b| 10 * joltage + (b - b'0') as u64)
35 })
36 .sum()
37}