Rust
My first version worked with numbers, but since I was still sick of yesterday's pow(10) calls, I changed it to use ascii for the second half - the nice thing is that means it can work with hex input with no modification!
Clippy was complaining about "needless_range_loops", but it's way more readable this way.
struct PowerSource(Vec<Bank>);
impl FromStr for PowerSource {
type Err = Report;
fn from_str(s: &str) -> Result<Self> {
let banks = s.lines().map(|l| Bank(l.to_owned())).collect();
Ok(Self(banks))
}
}
impl PowerSource {
fn max_joltage(&self, num_digits: usize) -> usize {
self.0.iter().map(|b| b.max_joltage(num_digits)).sum()
}
}
struct Bank(String);
impl Bank {
fn max_joltage(&self, num_digits: usize) -> usize {
let batts = self.0.as_bytes();
let mut digits = vec![b'0'; num_digits];
let mut start = 0;
for d in 0..num_digits {
for i in start..=batts.len() - num_digits + d {
if batts[i] > digits[d] {
digits[d] = batts[i];
start = i + 1;
}
}
}
usize::from_str(str::from_utf8(&digits).unwrap()).unwrap()
}
}