I'm still struggling to learn Rust, and also to figure out a good solution to these problems, but here's mine anyway:
#[allow(dead_code)]
pub fn part1(input: Lines<BufReader<File>>) {
let mut sum = 0;
for line in input.map_while(Result::ok) {
let total = find_joltage(line.as_bytes(), 2, false);
let res = str::from_utf8(total.as_slice()).unwrap();
sum += res.parse::<u32>().unwrap();
}
println!("{}", sum);
}
#[allow(dead_code)]
pub fn part2(input: Lines<BufReader<File>>) {
let mut sum = 0;
for (_, line) in input.map_while(Result::ok).enumerate() {
let total = find_joltage(line.as_bytes(), 12, false);
let res = str::from_utf8(total.as_slice()).unwrap();
sum += res.parse::<u64>().unwrap();
}
println!("{}", sum);
}
fn find_joltage(b: &[u8], size: usize, debug: bool) -> Vec<u8> {
if size == 0 {
return vec![];
}
let mut max: u8 = 0;
let mut max_i = 0;
for i in (0..=b.len() - size).rev() {
if b[i] >= max {
max = b[i];
max_i = i;
}
}
if debug {
println!("max = {}, i = {}", max as char, max_i);
}
let mut rest = find_joltage(&b[max_i + 1..], size - 1, debug);
rest.insert(0, max);
rest
}