From d5f25bd8bfe45ef7eea8c283cdc43bd6e2b8c56b Mon Sep 17 00:00:00 2001 From: Rorik Star Platinum Date: Mon, 15 Dec 2025 00:04:32 +0300 Subject: [PATCH] proverb --- rust/proverb/.exercism/config.json | 36 ++++++++++++ rust/proverb/.gitignore | 2 + rust/proverb/Cargo.toml | 9 +++ rust/proverb/HELP.md | 89 ++++++++++++++++++++++++++++++ rust/proverb/README.md | 51 +++++++++++++++++ rust/proverb/src/lib.rs | 14 +++++ rust/proverb/tests/proverb.rs | 75 +++++++++++++++++++++++++ 7 files changed, 276 insertions(+) create mode 100644 rust/proverb/.exercism/config.json create mode 100644 rust/proverb/.gitignore create mode 100644 rust/proverb/Cargo.toml create mode 100644 rust/proverb/HELP.md create mode 100644 rust/proverb/README.md create mode 100644 rust/proverb/src/lib.rs create mode 100644 rust/proverb/tests/proverb.rs diff --git a/rust/proverb/.exercism/config.json b/rust/proverb/.exercism/config.json new file mode 100644 index 0000000..a2346df --- /dev/null +++ b/rust/proverb/.exercism/config.json @@ -0,0 +1,36 @@ +{ + "authors": [ + "sacherjj" + ], + "contributors": [ + "attilahorvath", + "coriolinus", + "cwhakes", + "efx", + "ErikSchierboom", + "leoyvens", + "lutostag", + "navossoc", + "nfiles", + "petertseng", + "rofrol", + "stringparser", + "xakon", + "ZapAnton" + ], + "files": { + "solution": [ + "src/lib.rs", + "Cargo.toml" + ], + "test": [ + "tests/proverb.rs" + ], + "example": [ + ".meta/example.rs" + ] + }, + "blurb": "For want of a horseshoe nail, a kingdom was lost, or so the saying goes. Output the full text of this proverbial rhyme.", + "source": "Wikipedia", + "source_url": "https://en.wikipedia.org/wiki/For_Want_of_a_Nail" +} diff --git a/rust/proverb/.gitignore b/rust/proverb/.gitignore new file mode 100644 index 0000000..96ef6c0 --- /dev/null +++ b/rust/proverb/.gitignore @@ -0,0 +1,2 @@ +/target +Cargo.lock diff --git a/rust/proverb/Cargo.toml b/rust/proverb/Cargo.toml new file mode 100644 index 0000000..3ea43d7 --- /dev/null +++ b/rust/proverb/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "proverb" +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] diff --git a/rust/proverb/HELP.md b/rust/proverb/HELP.md new file mode 100644 index 0000000..22a6c00 --- /dev/null +++ b/rust/proverb/HELP.md @@ -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 \ No newline at end of file diff --git a/rust/proverb/README.md b/rust/proverb/README.md new file mode 100644 index 0000000..c4cf4fe --- /dev/null +++ b/rust/proverb/README.md @@ -0,0 +1,51 @@ +# Proverb + +Welcome to Proverb on Exercism's Rust Track. +If you need help running the tests or submitting your code, check out `HELP.md`. + +## Instructions + +For want of a horseshoe nail, a kingdom was lost, or so the saying goes. + +Given a list of inputs, generate the relevant proverb. +For example, given the list `["nail", "shoe", "horse", "rider", "message", "battle", "kingdom"]`, you will output the full text of this proverbial rhyme: + +```text +For want of a nail the shoe was lost. +For want of a shoe the horse was lost. +For want of a horse the rider was lost. +For want of a rider the message was lost. +For want of a message the battle was lost. +For want of a battle the kingdom was lost. +And all for the want of a nail. +``` + +Note that the list of inputs may vary; your solution should be able to handle lists of arbitrary length and content. +No line of the output text should be a static, unchanging string; all should vary according to the input given. + +## Source + +### Created by + +- @sacherjj + +### Contributed to by + +- @attilahorvath +- @coriolinus +- @cwhakes +- @efx +- @ErikSchierboom +- @leoyvens +- @lutostag +- @navossoc +- @nfiles +- @petertseng +- @rofrol +- @stringparser +- @xakon +- @ZapAnton + +### Based on + +Wikipedia - https://en.wikipedia.org/wiki/For_Want_of_a_Nail \ No newline at end of file diff --git a/rust/proverb/src/lib.rs b/rust/proverb/src/lib.rs new file mode 100644 index 0000000..f49d4b2 --- /dev/null +++ b/rust/proverb/src/lib.rs @@ -0,0 +1,14 @@ +pub fn build_proverb(list: &[&str]) -> String { + if list.is_empty() { + return String::new(); + } + + list.windows(2) + .map(|pair| format!("For want of a {} the {} was lost.", pair[0], pair[1])) + .chain(std::iter::once(format!( + "And all for the want of a {}.", + list[0] + ))) + .collect::>() + .join("\n") +} diff --git a/rust/proverb/tests/proverb.rs b/rust/proverb/tests/proverb.rs new file mode 100644 index 0000000..09fb350 --- /dev/null +++ b/rust/proverb/tests/proverb.rs @@ -0,0 +1,75 @@ +use proverb::*; + +#[test] +fn zero_pieces() { + let input = &[]; + let output = build_proverb(input); + let expected = String::new(); + assert_eq!(output, expected); +} + +#[test] +fn one_piece() { + let input = &["nail"]; + let output = build_proverb(input); + let expected: String = ["And all for the want of a nail."].join("\n"); + assert_eq!(output, expected); +} + +#[test] +fn two_pieces() { + let input = &["nail", "shoe"]; + let output = build_proverb(input); + let expected: String = [ + "For want of a nail the shoe was lost.", + "And all for the want of a nail.", + ] + .join("\n"); + assert_eq!(output, expected); +} + +#[test] +fn three_pieces() { + let input = &["nail", "shoe", "horse"]; + let output = build_proverb(input); + let expected: String = [ + "For want of a nail the shoe was lost.", + "For want of a shoe the horse was lost.", + "And all for the want of a nail.", + ] + .join("\n"); + assert_eq!(output, expected); +} + +#[test] +fn full_proverb() { + let input = &[ + "nail", "shoe", "horse", "rider", "message", "battle", "kingdom", + ]; + let output = build_proverb(input); + let expected: String = [ + "For want of a nail the shoe was lost.", + "For want of a shoe the horse was lost.", + "For want of a horse the rider was lost.", + "For want of a rider the message was lost.", + "For want of a message the battle was lost.", + "For want of a battle the kingdom was lost.", + "And all for the want of a nail.", + ] + .join("\n"); + assert_eq!(output, expected); +} + +#[test] +fn four_pieces_modernized() { + let input = &["pin", "gun", "soldier", "battle"]; + let output = build_proverb(input); + let expected: String = [ + "For want of a pin the gun was lost.", + "For want of a gun the soldier was lost.", + "For want of a soldier the battle was lost.", + "And all for the want of a pin.", + ] + .join("\n"); + assert_eq!(output, expected); +}