use std::io::{self, BufRead}; fn main() { let stdin = io::stdin(); let handle = stdin.lock(); let count = handle .lines() .map(|x| x.unwrap()) .fold((0, 0), |acc, x| (acc.0 + calculate_paper(&x), acc.1 + calculate_ribbon(&x))); println!("{:?}", count); } fn calculate_paper(dimensions: &str) -> i32 { let parts = dimensions .split('x') .map(|x| x.parse::().unwrap()) .collect::>(); let l = parts[0]; let w = parts[1]; let h = parts[2]; let e = l * w * h / parts.iter().max().unwrap(); (2 * l * w) + (2 * w * h) + (2 * h * l) + e } fn calculate_ribbon(dimensions: &str) -> i32 { let parts = dimensions .split('x') .map(|x| x.parse::().unwrap()) .collect::>(); let l = parts[0]; let w = parts[1]; let h = parts[2]; let e = (2 * l) + (2 * w) + (2 * h) - (2 * parts.iter().max().unwrap()); (l * w * h) + e } #[cfg(test)] mod tests { use super::{calculate_paper, calculate_ribbon}; #[test] fn example_01() { assert_eq!(58, calculate_paper("2x3x4")); } #[test] fn example_02() { assert_eq!(43, calculate_paper("1x1x10")); } #[test] fn example_03() { assert_eq!(34, calculate_ribbon("2x3x4")); } #[test] fn example_04() { assert_eq!(14, calculate_ribbon("1x1x10")); } }