use crate::prelude::*; pub fn solution() -> Solution { Solution::new(Day::new(7, 2021), part_1, part_2) .with_expected(328318, 89791146) } fn parse_crabs(input: &str) -> Result<(Vec, isize)> { let crabs = input .split(',') .map(str::parse) .collect::, _>>()?; let highest_crab = *crabs .iter() .max() .ok_or_else(|| eyre!("Unable to find highest crab"))?; Ok((crabs, highest_crab)) } fn part_1(input: &str) -> Result { let (crabs, highest_crab) = parse_crabs(input)?; (0..=highest_crab) .map(|target_position| { crabs .iter() .map(|crab| (target_position - crab).abs()) .sum::() }) .min() .map(|result| result.to_string()) .ok_or_else(|| eyre!("Unable to find lowest fuel")) } fn part_2(input: &str) -> Result { let (crabs, highest_crab) = parse_crabs(input)?; (0..=highest_crab) .map(|target_position| { crabs .iter() .map(|crab| (target_position - crab).abs()) .map(|steps| (steps * (steps + 1)) / 2) .sum::() }) .min() .map(|result| result.to_string()) .ok_or_else(|| eyre!("Unable to find lowest fuel")) }