Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions solutions/benches/benchmark.rs
Original file line number Diff line number Diff line change
@@ -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);
16 changes: 16 additions & 0 deletions solutions/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@

use rand::Rng;

pub fn random_removal(n: usize) -> usize {
let mut rng = rand::rng();
let mut numbers: Vec<f32> = (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
}
45 changes: 45 additions & 0 deletions solutions/src/main.rs
Original file line number Diff line number Diff line change
@@ -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::<usize>() 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::<f64>() / 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);
}