71 lines
1.4 KiB
Rust
71 lines
1.4 KiB
Rust
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::<i32>().unwrap())
|
|
.collect::<Vec<_>>();
|
|
|
|
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::<i32>().unwrap())
|
|
.collect::<Vec<_>>();
|
|
|
|
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"));
|
|
}
|
|
}
|