diff options
| author | Federico Igne <git@federicoigne.com> | 2020-12-29 09:27:22 +0000 |
|---|---|---|
| committer | Federico Igne <git@federicoigne.com> | 2021-11-03 18:55:08 +0000 |
| commit | bfe7a2e6d7e51b3973a169e592c7f507a7d96c2c (patch) | |
| tree | c38e5697443b310a7035a10c04b46b3796202962 /rust/sieve/src/lib.rs | |
| parent | f7620da880e3dade5fdce6fd0f51f290d4353654 (diff) | |
| download | exercism-bfe7a2e6d7e51b3973a169e592c7f507a7d96c2c.tar.gz exercism-bfe7a2e6d7e51b3973a169e592c7f507a7d96c2c.zip | |
[rust] Sieve
Diffstat (limited to 'rust/sieve/src/lib.rs')
| -rw-r--r-- | rust/sieve/src/lib.rs | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/rust/sieve/src/lib.rs b/rust/sieve/src/lib.rs new file mode 100644 index 0000000..307ff83 --- /dev/null +++ b/rust/sieve/src/lib.rs | |||
| @@ -0,0 +1,16 @@ | |||
| 1 | pub fn primes_up_to(upper_bound: u64) -> Vec<u64> { | ||
| 2 | let mut sieve: Vec<Option<u64>> = (2..=upper_bound).map(Some).collect(); | ||
| 3 | primes(&mut sieve); | ||
| 4 | sieve.iter().filter_map(|x| *x).collect() | ||
| 5 | } | ||
| 6 | |||
| 7 | fn primes(ps: &mut [Option<u64>]) { | ||
| 8 | if let Some(&n) = ps.first() { | ||
| 9 | if let Some(p) = n { | ||
| 10 | (p as usize..ps.len()) | ||
| 11 | .step_by(p as usize) | ||
| 12 | .for_each(|x| ps[x] = None) | ||
| 13 | } | ||
| 14 | primes(&mut ps[1..]); | ||
| 15 | } | ||
| 16 | } | ||
