Решение на упр.10 задача 1 от Милен Хаджиев
Резултати
- 2 точки от тестове
- 0 бонус точки
- 2 точки общо
- 2 успешни тест(а)
- 0 неуспешни тест(а)
Код
use std::thread;
#[derive(Clone, Copy)]
enum Predicate {
GreaterThan100,
Even,
Prime,
DivisibleBy7,
}
fn is_prime(n: i32) -> bool {
if n <= 1 {
return false;
}
if n == 2 || n == 3 {
return true;
}
if n % 2 == 0 || n % 3 == 0 {
return false;
}
let mut i = 5;
while i * i <= n {
if n % i == 0 {
return false;
}
i += 1;
}
true
}
fn parallel_filter(data: Vec<i32>, n_threads: usize, predicate: Predicate) -> Vec<i32> {
if data.is_empty() || n_threads == 0 {
return Vec::new();
}
let n_threads = n_threads.min(data.len());
let chunk_size = data.len() / n_threads;
let remainder = data.len() % n_threads;
let mut partitions = Vec::with_capacity(n_threads);
let mut current_start = 0;
for i in 0..n_threads {
let size = chunk_size + if i < remainder { 1 } else { 0 };
let partition = data[current_start..current_start + size].to_vec();
partitions.push(partition);
current_start += size;
}
let mut handles = Vec::with_capacity(n_threads);
for partition in partitions {
let pred = predicate.clone();
let handle = thread::spawn(move || {
let mut result = Vec::new();
for &num in &partition {
let matches = match pred {
Predicate::GreaterThan100 => num > 100,
Predicate::Even => num % 2 == 0,
Predicate::Prime => is_prime(num),
Predicate::DivisibleBy7 => num % 7 == 0,
};
if matches {
result.push(num);
}
}
result
});
handles.push(handle);
}
let mut final_result = Vec::new();
for handle in handles {
match handle.join() {
Ok(mut thread_result) => {
final_result.append(&mut thread_result);
}
Err(_) => {}
}
}
final_result
}
Лог от изпълнението
Updating crates.io index
Locking 17 packages to latest compatible versions
Compiling proc-macro2 v1.0.103
Compiling unicode-ident v1.0.22
Compiling quote v1.0.42
Compiling futures-core v0.3.31
Compiling futures-sink v0.3.31
Compiling futures-channel v0.3.31
Compiling futures-io v0.3.31
Compiling pin-project-lite v0.2.16
Compiling syn v2.0.111
Compiling memchr v2.7.6
Compiling slab v0.4.11
Compiling futures-task v0.3.31
Compiling pin-utils v0.1.0
Compiling solution v0.1.0 (/tmp/d20251218-1757769-19c5pel/solution)
warning: enum `Predicate` is never used
--> src/lib.rs:4:6
|
4 | enum Predicate {
| ^^^^^^^^^
|
= note: `#[warn(dead_code)]` on by default
warning: function `is_prime` is never used
--> src/lib.rs:11:4
|
11 | fn is_prime(n: i32) -> bool {
| ^^^^^^^^
warning: function `parallel_filter` is never used
--> src/lib.rs:35:4
|
35 | fn parallel_filter(data: Vec<i32>, n_threads: usize, predicate: Predicate) -> Vec<i32> {
| ^^^^^^^^^^^^^^^
warning: `solution` (lib) generated 3 warnings
Compiling futures-macro v0.3.31
Compiling futures-util v0.3.31
Compiling futures-executor v0.3.31
Compiling futures v0.3.31
Finished `test` profile [unoptimized + debuginfo] target(s) in 8.48s
Running tests/solution_test.rs (target/debug/deps/solution_test-ee0783488e12dce9)
running 2 tests
test solution_test::test_basic ... ok
test solution_test::test_uneven_split ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
