comptime sieve
This commit is contained in:
parent
485252a76f
commit
9624356fec
14 changed files with 685 additions and 0 deletions
36
rust/prime-factors/.exercism/config.json
Normal file
36
rust/prime-factors/.exercism/config.json
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
{
|
||||
"authors": [
|
||||
"sacherjj"
|
||||
],
|
||||
"contributors": [
|
||||
"attilahorvath",
|
||||
"coriolinus",
|
||||
"cwhakes",
|
||||
"eddyp",
|
||||
"efx",
|
||||
"ErikSchierboom",
|
||||
"lutostag",
|
||||
"nathanielknight",
|
||||
"nfiles",
|
||||
"petertseng",
|
||||
"rofrol",
|
||||
"stringparser",
|
||||
"xakon",
|
||||
"ZapAnton"
|
||||
],
|
||||
"files": {
|
||||
"solution": [
|
||||
"src/lib.rs",
|
||||
"Cargo.toml"
|
||||
],
|
||||
"test": [
|
||||
"tests/prime_factors.rs"
|
||||
],
|
||||
"example": [
|
||||
".meta/example.rs"
|
||||
]
|
||||
},
|
||||
"blurb": "Compute the prime factors of a given natural number.",
|
||||
"source": "The Prime Factors Kata by Uncle Bob",
|
||||
"source_url": "https://web.archive.org/web/20221026171801/http://butunclebob.com/ArticleS.UncleBob.ThePrimeFactorsKata"
|
||||
}
|
||||
2
rust/prime-factors/.gitignore
vendored
Normal file
2
rust/prime-factors/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
/target
|
||||
Cargo.lock
|
||||
9
rust/prime-factors/Cargo.toml
Normal file
9
rust/prime-factors/Cargo.toml
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
[package]
|
||||
name = "prime_factors"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
# Not all libraries from crates.io are available in Exercism's test runner.
|
||||
# The full list of available libraries is here:
|
||||
# https://github.com/exercism/rust-test-runner/blob/main/local-registry/Cargo.toml
|
||||
[dependencies]
|
||||
89
rust/prime-factors/HELP.md
Normal file
89
rust/prime-factors/HELP.md
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
# Help
|
||||
|
||||
## Running the tests
|
||||
|
||||
Execute the tests with:
|
||||
|
||||
```bash
|
||||
$ cargo test
|
||||
```
|
||||
|
||||
All but the first test have been ignored. After you get the first test to
|
||||
pass, open the tests source file which is located in the `tests` directory
|
||||
and remove the `#[ignore]` flag from the next test and get the tests to pass
|
||||
again. Each separate test is a function with `#[test]` flag above it.
|
||||
Continue, until you pass every test.
|
||||
|
||||
If you wish to run _only ignored_ tests without editing the tests source file, use:
|
||||
|
||||
```bash
|
||||
$ cargo test -- --ignored
|
||||
```
|
||||
|
||||
If you are using Rust 1.51 or later, you can run _all_ tests with
|
||||
|
||||
```bash
|
||||
$ cargo test -- --include-ignored
|
||||
```
|
||||
|
||||
To run a specific test, for example `some_test`, you can use:
|
||||
|
||||
```bash
|
||||
$ cargo test some_test
|
||||
```
|
||||
|
||||
If the specific test is ignored, use:
|
||||
|
||||
```bash
|
||||
$ cargo test some_test -- --ignored
|
||||
```
|
||||
|
||||
To learn more about Rust tests refer to the online [test documentation][rust-tests].
|
||||
|
||||
[rust-tests]: https://doc.rust-lang.org/book/ch11-02-running-tests.html
|
||||
|
||||
## Submitting your solution
|
||||
|
||||
You can submit your solution using the `exercism submit src/lib.rs Cargo.toml` command.
|
||||
This command will upload your solution to the Exercism website and print the solution page's URL.
|
||||
|
||||
It's possible to submit an incomplete solution which allows you to:
|
||||
|
||||
- See how others have completed the exercise
|
||||
- Request help from a mentor
|
||||
|
||||
## Need to get help?
|
||||
|
||||
If you'd like help solving the exercise, check the following pages:
|
||||
|
||||
- The [Rust track's documentation](https://exercism.org/docs/tracks/rust)
|
||||
- The [Rust track's programming category on the forum](https://forum.exercism.org/c/programming/rust)
|
||||
- [Exercism's programming category on the forum](https://forum.exercism.org/c/programming/5)
|
||||
- The [Frequently Asked Questions](https://exercism.org/docs/using/faqs)
|
||||
|
||||
Should those resources not suffice, you could submit your (incomplete) solution to request mentoring.
|
||||
|
||||
## Rust Installation
|
||||
|
||||
Refer to the [exercism help page][help-page] for Rust installation and learning
|
||||
resources.
|
||||
|
||||
## Submitting the solution
|
||||
|
||||
Generally you should submit all files in which you implemented your solution (`src/lib.rs` in most cases). If you are using any external crates, please consider submitting the `Cargo.toml` file. This will make the review process faster and clearer.
|
||||
|
||||
## Feedback, Issues, Pull Requests
|
||||
|
||||
Head to [the forum](https://forum.exercism.org/c/programming/rust/) and create a post to provide feedback about an exercise or if you want to help implement new exercises.
|
||||
Members of the rust track team are happy to help!
|
||||
|
||||
The GitHub [track repository][github] is the home for all of the Rust exercises.
|
||||
|
||||
If you want to know more about Exercism, take a look at the [contribution guide].
|
||||
|
||||
## Submitting Incomplete Solutions
|
||||
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
|
||||
|
||||
[help-page]: https://exercism.org/tracks/rust/learning
|
||||
[github]: https://github.com/exercism/rust
|
||||
[contribution guide]: https://exercism.org/docs/community/contributors
|
||||
68
rust/prime-factors/README.md
Normal file
68
rust/prime-factors/README.md
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
# Prime Factors
|
||||
|
||||
Welcome to Prime Factors on Exercism's Rust Track.
|
||||
If you need help running the tests or submitting your code, check out `HELP.md`.
|
||||
|
||||
## Instructions
|
||||
|
||||
Compute the prime factors of a given natural number.
|
||||
|
||||
A prime number is only evenly divisible by itself and 1.
|
||||
|
||||
Note that 1 is not a prime number.
|
||||
|
||||
## Example
|
||||
|
||||
What are the prime factors of 60?
|
||||
|
||||
- Our first divisor is 2.
|
||||
2 goes into 60, leaving 30.
|
||||
- 2 goes into 30, leaving 15.
|
||||
- 2 doesn't go cleanly into 15.
|
||||
So let's move on to our next divisor, 3.
|
||||
- 3 goes cleanly into 15, leaving 5.
|
||||
- 3 does not go cleanly into 5.
|
||||
The next possible factor is 4.
|
||||
- 4 does not go cleanly into 5.
|
||||
The next possible factor is 5.
|
||||
- 5 does go cleanly into 5.
|
||||
- We're left only with 1, so now, we're done.
|
||||
|
||||
Our successful divisors in that computation represent the list of prime factors of 60: 2, 2, 3, and 5.
|
||||
|
||||
You can check this yourself:
|
||||
|
||||
```text
|
||||
2 * 2 * 3 * 5
|
||||
= 4 * 15
|
||||
= 60
|
||||
```
|
||||
|
||||
Success!
|
||||
|
||||
## Source
|
||||
|
||||
### Created by
|
||||
|
||||
- @sacherjj
|
||||
|
||||
### Contributed to by
|
||||
|
||||
- @attilahorvath
|
||||
- @coriolinus
|
||||
- @cwhakes
|
||||
- @eddyp
|
||||
- @efx
|
||||
- @ErikSchierboom
|
||||
- @lutostag
|
||||
- @nathanielknight
|
||||
- @nfiles
|
||||
- @petertseng
|
||||
- @rofrol
|
||||
- @stringparser
|
||||
- @xakon
|
||||
- @ZapAnton
|
||||
|
||||
### Based on
|
||||
|
||||
The Prime Factors Kata by Uncle Bob - https://web.archive.org/web/20221026171801/http://butunclebob.com/ArticleS.UncleBob.ThePrimeFactorsKata
|
||||
3
rust/prime-factors/src/lib.rs
Normal file
3
rust/prime-factors/src/lib.rs
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
pub fn factors(n: u64) -> Vec<u64> {
|
||||
todo!("This should calculate the prime factors of {n}")
|
||||
}
|
||||
96
rust/prime-factors/tests/prime_factors.rs
Normal file
96
rust/prime-factors/tests/prime_factors.rs
Normal file
|
|
@ -0,0 +1,96 @@
|
|||
use prime_factors::*;
|
||||
|
||||
#[test]
|
||||
fn no_factors() {
|
||||
let factors = factors(1);
|
||||
let expected = [];
|
||||
assert_eq!(factors, expected);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[ignore]
|
||||
fn prime_number() {
|
||||
let factors = factors(2);
|
||||
let expected = [2];
|
||||
assert_eq!(factors, expected);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[ignore]
|
||||
fn another_prime_number() {
|
||||
let factors = factors(3);
|
||||
let expected = [3];
|
||||
assert_eq!(factors, expected);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[ignore]
|
||||
fn square_of_a_prime() {
|
||||
let factors = factors(9);
|
||||
let expected = [3, 3];
|
||||
assert_eq!(factors, expected);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[ignore]
|
||||
fn product_of_first_prime() {
|
||||
let factors = factors(4);
|
||||
let expected = [2, 2];
|
||||
assert_eq!(factors, expected);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[ignore]
|
||||
fn cube_of_a_prime() {
|
||||
let factors = factors(8);
|
||||
let expected = [2, 2, 2];
|
||||
assert_eq!(factors, expected);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[ignore]
|
||||
fn product_of_second_prime() {
|
||||
let factors = factors(27);
|
||||
let expected = [3, 3, 3];
|
||||
assert_eq!(factors, expected);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[ignore]
|
||||
fn product_of_third_prime() {
|
||||
let factors = factors(625);
|
||||
let expected = [5, 5, 5, 5];
|
||||
assert_eq!(factors, expected);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[ignore]
|
||||
fn product_of_first_and_second_prime() {
|
||||
let factors = factors(6);
|
||||
let expected = [2, 3];
|
||||
assert_eq!(factors, expected);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[ignore]
|
||||
fn product_of_primes_and_non_primes() {
|
||||
let factors = factors(12);
|
||||
let expected = [2, 2, 3];
|
||||
assert_eq!(factors, expected);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[ignore]
|
||||
fn product_of_primes() {
|
||||
let factors = factors(901_255);
|
||||
let expected = [5, 17, 23, 461];
|
||||
assert_eq!(factors, expected);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[ignore]
|
||||
fn factors_include_a_large_prime() {
|
||||
let factors = factors(93_819_012_551);
|
||||
let expected = [11, 9_539, 894_119];
|
||||
assert_eq!(factors, expected);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue