1
0

Add solution for "Day 3: Lobby", part 2

This commit is contained in:
Stefan Müller
2026-01-30 20:04:20 +01:00
parent 4b747e3705
commit a3a9eb0e45
4 changed files with 28 additions and 17 deletions
+20 -15
View File
@@ -4,20 +4,24 @@ use std::io::BufRead;
pub struct Lobby {}
impl Lobby {
fn largest_joltage(bank: &str) -> u64 {
let mut best = (0, 0);
for d in bank.bytes().take(bank.len() - 1) {
if best.0 < d {
best = (d, 0)
} else if best.1 < d {
best.1 = d;
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);
}
let last = bank.bytes().last().unwrap();
if best.1 < last {
best.1 = last;
}
u64::from((best.0 - '0' as u8) * 10 + (best.1 - '0' as u8))
u64::from(best.iter().fold(0, |acc: u64, &x| acc * 10 + u64::from(x)))
}
}
@@ -26,10 +30,11 @@ impl Solver for Lobby {
const PUZZLE_NAME: &'static str = "Lobby";
fn process_data<R: BufRead>(&self, reader: R) -> (u64, u64) {
let mut joltage = 0;
let mut joltages = (0, 0);
for line in reader.lines().map_while(Result::ok) {
joltage += Self::largest_joltage(&line);
joltages.0 += Self::largest_joltage(&line, Self::PART1_MAX_BATTERIES);
joltages.1 += Self::largest_joltage(&line, Self::PART2_MAX_BATTERIES);
}
(joltage, 0)
joltages
}
}