diff --git a/Week-02/Day-09_Trapping-Rain-Water/day9/Cargo.toml b/Week-02/Day-09_Trapping-Rain-Water/day9/Cargo.toml new file mode 100644 index 0000000..48c42be --- /dev/null +++ b/Week-02/Day-09_Trapping-Rain-Water/day9/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "day9" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/Week-02/Day-09_Trapping-Rain-Water/day9/src/lib.rs b/Week-02/Day-09_Trapping-Rain-Water/day9/src/lib.rs new file mode 100644 index 0000000..e0464cc --- /dev/null +++ b/Week-02/Day-09_Trapping-Rain-Water/day9/src/lib.rs @@ -0,0 +1,26 @@ +pub fn trap(heights: Vec) -> u16 { + let maxh = heights.iter().max().cloned().unwrap_or(0); + let mut water: u16 = + maxh as u16 * heights.len() as u16 - heights.iter().map(|x| *x as u16).sum::(); + let mut maxt; + + maxt = 0; + for h in heights.iter() { + maxt = std::cmp::max(maxt, *h); + if maxt == maxh { + break; + } + water -= maxh as u16 - maxt as u16; + } + + maxt = 0; + for h in heights.iter().rev() { + maxt = std::cmp::max(maxt, *h); + if maxt == maxh { + break; + } + water -= maxh as u16 - maxt as u16; + } + + water +} diff --git a/Week-02/Day-09_Trapping-Rain-Water/day9/src/main.rs b/Week-02/Day-09_Trapping-Rain-Water/day9/src/main.rs new file mode 100644 index 0000000..d043dc6 --- /dev/null +++ b/Week-02/Day-09_Trapping-Rain-Water/day9/src/main.rs @@ -0,0 +1,24 @@ +use std::io::{self, Write}; + +use day9::trap; + +fn main() { + let mut buffer = String::new(); + + print!("Insert space separated heights: "); + io::stdout().flush().expect("Failed to flush stdout."); + + io::stdin() + .read_line(&mut buffer) + .expect("Failed to read from input."); + + let heights = buffer + .trim() + .split(' ') + .filter(|x| !x.is_empty()) + .map(|x| x.parse().expect("A not number has been found")) + .collect(); + + let water = trap(heights); + println!("{}", water); +} diff --git a/Week-02/Day-09_Trapping-Rain-Water/day9/tests/exaples.rs b/Week-02/Day-09_Trapping-Rain-Water/day9/tests/exaples.rs new file mode 100644 index 0000000..df9ceba --- /dev/null +++ b/Week-02/Day-09_Trapping-Rain-Water/day9/tests/exaples.rs @@ -0,0 +1,11 @@ +use day9::trap; + +#[test] +fn exaple1() { + assert_eq!(trap([0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1].to_vec()), 6); +} + +#[test] +fn exaple2() { + assert_eq!(trap([4, 2, 0, 3, 2, 5].to_vec()), 9); +}