Add solution for "Day 3: Lobby", part 2
This commit is contained in:
+20
-15
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user