41 lines
1.3 KiB
Rust
41 lines
1.3 KiB
Rust
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 - b'0').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<R: BufRead>(&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
|
|
}
|
|
}
|