From 13b2fc61b68bc705a308a35be05eb2b1810863a1 Mon Sep 17 00:00:00 2001 From: Jonas Berlin Date: Sun, 16 Aug 2020 13:18:07 +0300 Subject: Challenge 73 Task 2 only, 2 alternative implementations --- challenge-073/xkr47/rust/Cargo.toml | 16 +++++++++++++ challenge-073/xkr47/rust/ch-2-2.rs | 47 +++++++++++++++++++++++++++++++++++++ challenge-073/xkr47/rust/ch-2.rs | 18 ++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 challenge-073/xkr47/rust/Cargo.toml create mode 100644 challenge-073/xkr47/rust/ch-2-2.rs create mode 100644 challenge-073/xkr47/rust/ch-2.rs diff --git a/challenge-073/xkr47/rust/Cargo.toml b/challenge-073/xkr47/rust/Cargo.toml new file mode 100644 index 0000000000..59facb0ade --- /dev/null +++ b/challenge-073/xkr47/rust/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "pwd-073" +version = "0.1.0" +authors = ["Jonas Berlin "] +edition = "2018" + +[dependencies] +num-traits = "0.2" + +[[bin]] +name = "ch-2" +path = "ch-2.rs" + +[[bin]] +name = "ch-2-2" +path = "ch-2-2.rs" diff --git a/challenge-073/xkr47/rust/ch-2-2.rs b/challenge-073/xkr47/rust/ch-2-2.rs new file mode 100644 index 0000000000..87aefc5875 --- /dev/null +++ b/challenge-073/xkr47/rust/ch-2-2.rs @@ -0,0 +1,47 @@ +use std::ops::Deref; +use num_traits::Bounded; + +// Alternate impl as an iterator + +fn main() { + let a = vec![7, 8, 3, 12, 10]; + let o: Vec = doit(&a); + assert_eq!(o, vec![0, 7, 0, 3, 3]); + + let a = vec![4, 6, 5]; + let o: Vec = doit(&a); + assert_eq!(o, vec![0, 4, 4]); +} + +fn doit(a: &Vec) -> Vec { + MinLeft::new(a.iter()).collect() +} + +struct MinLeft { + a: I, + min: T, +} + +impl MinLeft { + fn new(a: I) -> MinLeft { + MinLeft { + a, + min: T::max_value(), + } + } +} + +impl<'a, T: Bounded + Copy + Ord + Default, P: Deref, I: Iterator> Iterator for MinLeft { + type Item = T; + + fn next(&mut self) -> Option { + match self.a.next() { + Some(next) => { + let result = if self.min < *next { self.min } else { Default::default() }; + self.min = self.min.min(*next); + Some(result) + }, + None => None + } + } +} diff --git a/challenge-073/xkr47/rust/ch-2.rs b/challenge-073/xkr47/rust/ch-2.rs new file mode 100644 index 0000000000..3cec5f12f5 --- /dev/null +++ b/challenge-073/xkr47/rust/ch-2.rs @@ -0,0 +1,18 @@ +fn main() { + let a = vec![7, 8, 3, 12, 10]; + let o: Vec = doit(&a); + assert_eq!(o, vec![0, 7, 0, 3, 3]); + + let a = vec![4, 6, 5]; + let o: Vec = doit(&a); + assert_eq!(o, vec![0, 4, 4]); +} + +fn doit(a: &Vec) -> Vec { + let mut min = i32::max_value(); + a.iter().map(|next| { + let result = if min < *next { min } else { 0 }; + min = min.min(*next); + result + }).collect() +} -- cgit