From 38ee11874977e107dbfa3ebcada22300299dd823 Mon Sep 17 00:00:00 2001 From: Arjun31415 Date: Thu, 6 Oct 2022 20:56:26 +0530 Subject: [PATCH 1/8] need certain unstable features --- src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib.rs b/src/lib.rs index 28ade98d5b1..c19c0e5c559 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +#![feature(map_first_last)] pub mod big_integer; pub mod ciphers; pub mod data_structures; From 4ec0dce9b0303eb1c811f8c9471a5c91c8ae7d90 Mon Sep 17 00:00:00 2001 From: Arjun31415 Date: Thu, 6 Oct 2022 20:56:37 +0530 Subject: [PATCH 2/8] added basic MEX implementation --- src/general/mex.rs | 72 ++++++++++++++++++++++++++++++++++++++++++++++ src/general/mod.rs | 1 + 2 files changed, 73 insertions(+) create mode 100644 src/general/mex.rs diff --git a/src/general/mex.rs b/src/general/mex.rs new file mode 100644 index 00000000000..e1117d831f2 --- /dev/null +++ b/src/general/mex.rs @@ -0,0 +1,72 @@ +use std::collections::BTreeSet; + +// Find minimum excluded number from a set of given numbers using a set +// NOTE: Don't remove allow, else clippy error: function not used +#[allow(dead_code)] +fn mex_using_set(arr: &[i64]) -> i64 { + let mut s: BTreeSet = BTreeSet::new(); + for i in 0..arr.len() + 1 { + s.insert(i as i64); + } + for x in arr { + s.remove(x); + } + return *s.first().unwrap(); +} +// NOTE: Don't remove allow, else clippy error: function not used +#[allow(dead_code)] +fn mex_using_sort(arr: &[i64]) -> i64 { + let mut arr = arr.to_vec(); + arr.sort(); + let mut mex = 0; + for x in arr { + if x == mex { + mex += 1; + } + } + mex +} + +#[cfg(test)] +mod tests { + use super::*; + struct MexTests { + test_arrays: Vec>, + outputs: Vec, + } + impl MexTests { + fn new() -> Self { + return Self { + test_arrays: vec![ + vec![-1, 0, 1, 2, 3], + vec![-100, 0, 1, 2, 3, 5], + vec![-1000000, 0, 1, 2, 5], + vec![2, 0, 1, 2, 4], + vec![1, 2, 3, 0, 4], + vec![0, 1, 5, 2, 4, 3], + vec![0, 1, 2, 3, 4, 5, 6], + vec![0, 1, 2, 3, 4, 5, 6, 7], + vec![0, 1, 2, 3, 4, 5, 6, 7, 8], + ], + outputs: vec![4, 4, 3, 3, 5, 6, 7, 8, 9], + }; + } + fn test_function(&self, f: fn(&[i64]) -> i64) { + for (nums, output) in self.test_arrays.iter().zip(self.outputs.iter()) { + assert_eq!(f(nums), *output); + } + } + } + #[test] + fn test_mex_using_set() { + let tests = MexTests::new(); + mex_using_set(&[1, 23, 3]); + tests.test_function(mex_using_set); + } + #[test] + fn test_mex_using_sort() { + let tests = MexTests::new(); + tests.test_function(mex_using_sort); + } +} +// Find minimum excluded number from a set of given numbers using sort diff --git a/src/general/mod.rs b/src/general/mod.rs index eded2921566..fb6c538f07a 100644 --- a/src/general/mod.rs +++ b/src/general/mod.rs @@ -2,6 +2,7 @@ mod convex_hull; mod hanoi; mod huffman_encoding; mod kmeans; +mod mex; mod nqueens; mod two_sum; From 4ca654b05a085ffcbe30d5de272423816e68bd34 Mon Sep 17 00:00:00 2001 From: Arjun31415 Date: Thu, 6 Oct 2022 21:21:27 +0530 Subject: [PATCH 3/8] added comments --- src/general/mex.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/general/mex.rs b/src/general/mex.rs index e1117d831f2..0266f8b671f 100644 --- a/src/general/mex.rs +++ b/src/general/mex.rs @@ -2,6 +2,9 @@ use std::collections::BTreeSet; // Find minimum excluded number from a set of given numbers using a set // NOTE: Don't remove allow, else clippy error: function not used +/// Finds the MEX of the values provided in `arr` +/// Uses [`BTreeSet`](std::collections::BTreeSet) +/// O(nlog(n)) implementation #[allow(dead_code)] fn mex_using_set(arr: &[i64]) -> i64 { let mut s: BTreeSet = BTreeSet::new(); @@ -15,6 +18,9 @@ fn mex_using_set(arr: &[i64]) -> i64 { } // NOTE: Don't remove allow, else clippy error: function not used #[allow(dead_code)] +/// Finds the MEX of the values provided in `arr` +/// Uses sorting +/// O(nlog(n)) implementation fn mex_using_sort(arr: &[i64]) -> i64 { let mut arr = arr.to_vec(); arr.sort(); From 25ff5db10576dee1cc20f1e66b519b137ba99bb5 Mon Sep 17 00:00:00 2001 From: Arjun31415 Date: Thu, 6 Oct 2022 21:34:58 +0530 Subject: [PATCH 4/8] fixed spurious line --- src/general/mex.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/general/mex.rs b/src/general/mex.rs index 0266f8b671f..fd909d09a74 100644 --- a/src/general/mex.rs +++ b/src/general/mex.rs @@ -75,4 +75,3 @@ mod tests { tests.test_function(mex_using_sort); } } -// Find minimum excluded number from a set of given numbers using sort From 69f274e85a3d75e09f708ba744de84b26078227e Mon Sep 17 00:00:00 2001 From: Arjun31415 Date: Thu, 6 Oct 2022 21:42:11 +0530 Subject: [PATCH 5/8] fix mod bugs --- src/general/mex.rs | 4 ++-- src/general/mod.rs | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/general/mex.rs b/src/general/mex.rs index fd909d09a74..9de8ae80203 100644 --- a/src/general/mex.rs +++ b/src/general/mex.rs @@ -6,7 +6,7 @@ use std::collections::BTreeSet; /// Uses [`BTreeSet`](std::collections::BTreeSet) /// O(nlog(n)) implementation #[allow(dead_code)] -fn mex_using_set(arr: &[i64]) -> i64 { +pub fn mex_using_set(arr: &[i64]) -> i64 { let mut s: BTreeSet = BTreeSet::new(); for i in 0..arr.len() + 1 { s.insert(i as i64); @@ -21,7 +21,7 @@ fn mex_using_set(arr: &[i64]) -> i64 { /// Finds the MEX of the values provided in `arr` /// Uses sorting /// O(nlog(n)) implementation -fn mex_using_sort(arr: &[i64]) -> i64 { +pub fn mex_using_sort(arr: &[i64]) -> i64 { let mut arr = arr.to_vec(); arr.sort(); let mut mex = 0; diff --git a/src/general/mod.rs b/src/general/mod.rs index fb6c538f07a..28ac6b3de69 100644 --- a/src/general/mod.rs +++ b/src/general/mod.rs @@ -5,11 +5,12 @@ mod kmeans; mod mex; mod nqueens; mod two_sum; - pub use self::convex_hull::convex_hull_graham; pub use self::hanoi::hanoi; pub use self::huffman_encoding::{HuffmanDictionary, HuffmanEncoding}; pub use self::kmeans::f32::kmeans as kmeans_f32; pub use self::kmeans::f64::kmeans as kmeans_f64; +pub use self::mex::mex_using_set; +pub use self::mex::mex_using_sort; pub use self::nqueens::nqueens; pub use self::two_sum::two_sum; From ed10b6ca1488310c6f2d7be348f86677de0d61a9 Mon Sep 17 00:00:00 2001 From: Arjun31415 Date: Thu, 6 Oct 2022 21:45:41 +0530 Subject: [PATCH 6/8] fix `#![feature(...)]` --- src/general/mex.rs | 8 +++++++- src/lib.rs | 1 - 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/general/mex.rs b/src/general/mex.rs index 9de8ae80203..f43751d2ad7 100644 --- a/src/general/mex.rs +++ b/src/general/mex.rs @@ -14,7 +14,13 @@ pub fn mex_using_set(arr: &[i64]) -> i64 { for x in arr { s.remove(x); } - return *s.first().unwrap(); + // TODO: change the next 10 lines to *s.first().unwrap() when merged into stable + // loop should never have 0 elements + for x in s { + return x; + } + // -100 should never be returned + -100 } // NOTE: Don't remove allow, else clippy error: function not used #[allow(dead_code)] diff --git a/src/lib.rs b/src/lib.rs index c19c0e5c559..28ade98d5b1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,3 @@ -#![feature(map_first_last)] pub mod big_integer; pub mod ciphers; pub mod data_structures; From 36ed07c095388d41618740907a57e3f9e8324c24 Mon Sep 17 00:00:00 2001 From: Arjun31415 Date: Thu, 6 Oct 2022 21:50:42 +0530 Subject: [PATCH 7/8] fix the fix --- src/general/mex.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/general/mex.rs b/src/general/mex.rs index f43751d2ad7..78e10c5750b 100644 --- a/src/general/mex.rs +++ b/src/general/mex.rs @@ -15,12 +15,12 @@ pub fn mex_using_set(arr: &[i64]) -> i64 { s.remove(x); } // TODO: change the next 10 lines to *s.first().unwrap() when merged into stable - // loop should never have 0 elements - for x in s { - return x; + // set should never have 0 elements + if let Some(x) = s.into_iter().next() { + x + } else { + panic!("Some unknown error in mex_using_set") } - // -100 should never be returned - -100 } // NOTE: Don't remove allow, else clippy error: function not used #[allow(dead_code)] From ec40590736d664f4ed6f29eb62f4332c75fbe5a9 Mon Sep 17 00:00:00 2001 From: Arjun31415 Date: Fri, 7 Oct 2022 12:52:42 +0530 Subject: [PATCH 8/8] remove `#[allow]` --- src/general/mex.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/general/mex.rs b/src/general/mex.rs index 78e10c5750b..aa79ea1fe60 100644 --- a/src/general/mex.rs +++ b/src/general/mex.rs @@ -1,11 +1,9 @@ use std::collections::BTreeSet; // Find minimum excluded number from a set of given numbers using a set -// NOTE: Don't remove allow, else clippy error: function not used /// Finds the MEX of the values provided in `arr` /// Uses [`BTreeSet`](std::collections::BTreeSet) /// O(nlog(n)) implementation -#[allow(dead_code)] pub fn mex_using_set(arr: &[i64]) -> i64 { let mut s: BTreeSet = BTreeSet::new(); for i in 0..arr.len() + 1 { @@ -22,8 +20,6 @@ pub fn mex_using_set(arr: &[i64]) -> i64 { panic!("Some unknown error in mex_using_set") } } -// NOTE: Don't remove allow, else clippy error: function not used -#[allow(dead_code)] /// Finds the MEX of the values provided in `arr` /// Uses sorting /// O(nlog(n)) implementation