diff --git a/solutions/benches/benchmark.rs b/solutions/benches/benchmark.rs new file mode 100644 index 0000000..e592696 --- /dev/null +++ b/solutions/benches/benchmark.rs @@ -0,0 +1,10 @@ +use criterion::{black_box, criterion_group, criterion_main, Criterion}; +use cryptoMiningAssignment::random_removal; + +fn benchmark(c: &mut Criterion) { + c.bench_function("random_removal 50", |b| b.iter(|| random_removal(black_box(50)))); + c.bench_function("random_removal 100", |b| b.iter(|| random_removal(black_box(100)))); +} + +criterion_group!(benches, benchmark); +criterion_main!(benches); diff --git a/solutions/src/lib.rs b/solutions/src/lib.rs new file mode 100644 index 0000000..a7f866a --- /dev/null +++ b/solutions/src/lib.rs @@ -0,0 +1,16 @@ + +use rand::Rng; + +pub fn random_removal(n: usize) -> usize { + let mut rng = rand::rng(); + let mut numbers: Vec = (0..n).map(|_| rng.random_range(0.0..1.0)).collect(); + let mut count = 0; + + while !numbers.is_empty() { + count += 1; + let rand_num = rng.random_range(0.0..1.0); + numbers.retain(|&x| (x - rand_num).abs() > 1e-5); + } + + count +} diff --git a/solutions/src/main.rs b/solutions/src/main.rs new file mode 100644 index 0000000..484303d --- /dev/null +++ b/solutions/src/main.rs @@ -0,0 +1,45 @@ +use std::io; +use std::time::Instant; +use cryptoMiningAssignment::random_removal; // Import from lib.rs + +fn main() { + println!("Enter a number between 1 and 100:"); + + let mut input = String::new(); + io::stdin().read_line(&mut input).expect("Failed to read line"); + + let n: usize = input.trim().parse().expect("Please enter a valid number"); + + if n < 1 || n > 100 { + println!("Number out of range! Please enter a number between 1 and 100."); + return; + } + + let mut trials = Vec::new(); + let mut times = Vec::new(); + + for _ in 0..100 { + let start_time = Instant::now(); + let count = random_removal(n); + let duration = start_time.elapsed().as_secs_f64(); + + trials.push(count); + times.push(duration); + } + + let min = *trials.iter().min().unwrap(); + let max = *trials.iter().max().unwrap(); + let avg = trials.iter().sum::() as f32 / trials.len() as f32; + + let min_time = times.iter().cloned().fold(f64::INFINITY, f64::min); + let max_time = times.iter().cloned().fold(f64::NEG_INFINITY, f64::max); + let avg_time = times.iter().sum::() / times.len() as f64; + + println!("Minimum iterations: {}", min); + println!("Maximum iterations: {}", max); + println!("Average iterations: {:.2}", avg); + println!("Minimum time taken: {:.6} seconds", min_time); + println!("Maximum time taken: {:.6} seconds", max_time); + println!("Average time taken: {:.6} seconds", avg_time); +} +