pub fn day3_part1(input: &str) -> String { let batteries = parse(input); let sum: u64 = batteries.iter().map(|bank| max_joltage(bank, 2)).sum(); sum.to_string() } pub fn day3_part2(input: &str) -> String { let batteries = parse(input); let sum: u64 = batteries.iter().map(|bank| max_joltage(bank, 12)).sum(); sum.to_string() } fn max_joltage(bank: &[u8], battery_count: usize) -> u64 { let bank_length = bank.len(); let mut digits = Vec::with_capacity(battery_count); let mut cursor = 0; for place in 0..battery_count { let range = cursor..bank_length - (battery_count - (place + 1)); let (index_of_max_digit, max_digit) = bank[range] .iter() .enumerate() .max_by_key(|(index, digit)| (*digit, bank_length - index)) .unwrap(); cursor = index_of_max_digit + cursor + 1; digits.push(max_digit) } digits .iter() .fold(0, |acc, &&digit| acc * 10 + digit as u64) } fn parse(input: &str) -> Vec> { input .lines() .map(|bank| { bank.chars() .map(|c| c.to_digit(10).unwrap() as u8) .collect() }) .collect() }