fn main() { let input = advent::read_lines(2); println!("2a: {}", calculate(&input, area_with_slack)); println!("2b: {}", calculate(&input, ribbon_length)); } fn area_with_slack(a: u32, b: u32, c: u32) -> u32 { let x = a * b; let y = a * c; let z = b * c; let slack = *[x, y, z].iter().min().unwrap(); 2*x + 2*y + 2*z + slack } fn ribbon_length(a: u32, b: u32, c: u32) -> u32 { let mut lens = Vec::from([a, b, c]); lens.sort(); 2 * lens[0] + 2 * lens[1] + lens.iter().product::() } fn calculate>(input: &[T], f: fn(u32, u32, u32) -> u32) -> u32 { input.iter() .map(|line| line.as_ref() .splitn(3, 'x') .map(|n| n.parse::().unwrap()) .collect::>()) .map(|v| f(v[0], v[1], v[2])) .sum() } #[cfg(test)] mod tests { use super::*; #[test] fn test_area() { assert_eq!(area_with_slack(2,3,4), 58); assert_eq!(area_with_slack(1,1,10), 43); } #[test] fn test_ribbon() { assert_eq!(ribbon_length(2,3,4), 34); assert_eq!(ribbon_length(1,1,10), 14); } }