use crate::solvers::Solver; use std::io::BufRead; pub struct Lobby {} impl Lobby { const PART1_MAX_BATTERIES: usize = 2; const PART2_MAX_BATTERIES: usize = 12; fn largest_joltage(bank: &str, max_batteries: usize) -> u64 { let mut best = vec![0_u8; max_batteries]; for (i, d) in bank.bytes().map(|c| c - '0' as u8).enumerate() { let mut fill_index = max_batteries; let skip = (max_batteries + i).saturating_sub(bank.len()); for (j, b) in best.iter_mut().skip(skip).enumerate() { if *b < d { *b = d; fill_index = j + 1 + skip; break; } } best[fill_index..].fill(0); } u64::from(best.iter().fold(0, |acc: u64, &x| acc * 10 + u64::from(x))) } } impl Solver for Lobby { const PUZZLE_INDEX: u8 = 3; const PUZZLE_NAME: &'static str = "Lobby"; fn process_data(&self, reader: R) -> (u64, u64) { let mut joltages = (0, 0); for line in reader.lines().map_while(Result::ok) { joltages.0 += Self::largest_joltage(&line, Self::PART1_MAX_BATTERIES); joltages.1 += Self::largest_joltage(&line, Self::PART2_MAX_BATTERIES); } joltages } }