Решение на упр.10 задача 1 от Илиян Гаврилов

Обратно към всички решения

Към профила на Илиян Гаврилов

Код

use std::thread;
#[derive(Clone, Copy)]
pub enum Predicate {
GreaterThan100,
Even,
Prime,
DivisibleBy7,
}
pub fn parallel_filter(data: Vec<i32>, n_threads: usize, predicate: Predicate) -> Vec<i32> {
if data.is_empty() || n_threads == 0 {
return Vec::new();
}
let chunk_size = (data.len() + n_threads - 1) / n_threads;
let mut handles = vec![];
for chunk in data.chunks(chunk_size) {
let chunk_vec = chunk.to_vec();
let handle = thread::spawn(move || filter_chunk(chunk_vec, predicate));
handles.push(handle);
}
let mut result = Vec::new();
for handle in handles {
if let Ok(filtered) = handle.join() {
result.extend(filtered);
}
}
result
}
fn filter_chunk(chunk: Vec<i32>, predicate: Predicate) -> Vec<i32> {
chunk
.into_iter()
.filter(|&x| matches_predicate(x, predicate))
.collect()
}
fn matches_predicate(value: i32, predicate: Predicate) -> bool {
match predicate {
Predicate::GreaterThan100 => value > 100,
Predicate::Even => value % 2 == 0,
Predicate::Prime => is_prime(value),
Predicate::DivisibleBy7 => value % 7 == 0,
}
}
fn is_prime(n: i32) -> bool {
// Better approach, but I don't know if it will work with the grader:
// is_prime_(n)
const PRIMES: &[i32] = &[
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107,
109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229,
233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359,
367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491,
499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641,
643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787,
797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941,
947, 953, 967, 971, 977, 983, 991, 997,
];
PRIMES.contains(&n)
}
fn main() {
}

История (1 версия и 0 коментара)

Илиян качи първо решение на 14.12.2025 19:09 (преди 3 дена)