diff --git a/rust/leap/.exercism/config.json b/rust/leap/.exercism/config.json new file mode 100644 index 0000000..95d0448 --- /dev/null +++ b/rust/leap/.exercism/config.json @@ -0,0 +1,50 @@ +{ + "authors": [ + "EduardoBautista" + ], + "contributors": [ + "andrewclarkson", + "andy5995", + "ashleygwilliams", + "ClashTheBunny", + "coriolinus", + "cwhakes", + "darnuria", + "EduardoBautista", + "efx", + "Emerentius", + "ErikSchierboom", + "hunger", + "IanWhitney", + "JIghtuse", + "jonasbn", + "kytrinyx", + "leoyvens", + "lutostag", + "mkantor", + "navossoc", + "nfiles", + "petertseng", + "pminten", + "rofrol", + "sshine", + "stringparser", + "xakon", + "ZapAnton" + ], + "files": { + "solution": [ + "src/lib.rs", + "Cargo.toml" + ], + "test": [ + "tests/leap.rs" + ], + "example": [ + ".meta/example.rs" + ] + }, + "blurb": "Determine whether a given year is a leap year.", + "source": "CodeRanch Cattle Drive, Assignment 3", + "source_url": "https://web.archive.org/web/20240907033714/https://coderanch.com/t/718816/Leap" +} diff --git a/rust/leap/.gitignore b/rust/leap/.gitignore new file mode 100644 index 0000000..96ef6c0 --- /dev/null +++ b/rust/leap/.gitignore @@ -0,0 +1,2 @@ +/target +Cargo.lock diff --git a/rust/leap/Cargo.toml b/rust/leap/Cargo.toml new file mode 100644 index 0000000..fa2e07b --- /dev/null +++ b/rust/leap/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "leap" +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/leap/HELP.md b/rust/leap/HELP.md new file mode 100644 index 0000000..22a6c00 --- /dev/null +++ b/rust/leap/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/leap/README.md b/rust/leap/README.md new file mode 100644 index 0000000..e8d64b8 --- /dev/null +++ b/rust/leap/README.md @@ -0,0 +1,68 @@ +# Leap + +Welcome to Leap on Exercism's Rust Track. +If you need help running the tests or submitting your code, check out `HELP.md`. + +## Introduction + +A leap year (in the Gregorian calendar) occurs: + +- In every year that is evenly divisible by 4. +- Unless the year is evenly divisible by 100, in which case it's only a leap year if the year is also evenly divisible by 400. + +Some examples: + +- 1997 was not a leap year as it's not divisible by 4. +- 1900 was not a leap year as it's not divisible by 400. +- 2000 was a leap year! + +~~~~exercism/note +For a delightful, four-minute explanation of the whole phenomenon of leap years, check out [this YouTube video](https://www.youtube.com/watch?v=xX96xng7sAE). +~~~~ + +## Instructions + +Your task is to determine whether a given year is a leap year. + +You may use the [`arithmetic remainder` operator](https://doc.rust-lang.org/book/appendix-02-operators.html) to test for divisibility. + +## Source + +### Created by + +- @EduardoBautista + +### Contributed to by + +- @andrewclarkson +- @andy5995 +- @ashleygwilliams +- @ClashTheBunny +- @coriolinus +- @cwhakes +- @darnuria +- @EduardoBautista +- @efx +- @Emerentius +- @ErikSchierboom +- @hunger +- @IanWhitney +- @JIghtuse +- @jonasbn +- @kytrinyx +- @leoyvens +- @lutostag +- @mkantor +- @navossoc +- @nfiles +- @petertseng +- @pminten +- @rofrol +- @sshine +- @stringparser +- @xakon +- @ZapAnton + +### Based on + +CodeRanch Cattle Drive, Assignment 3 - https://web.archive.org/web/20240907033714/https://coderanch.com/t/718816/Leap \ No newline at end of file diff --git a/rust/leap/src/lib.rs b/rust/leap/src/lib.rs new file mode 100644 index 0000000..9d6b104 --- /dev/null +++ b/rust/leap/src/lib.rs @@ -0,0 +1,3 @@ +pub fn is_leap_year(year: u64) -> bool { + (0 == year % 4) && (0 != year % 100 || 0 == year % 400) +} diff --git a/rust/leap/tests/leap.rs b/rust/leap/tests/leap.rs new file mode 100644 index 0000000..d20f5d5 --- /dev/null +++ b/rust/leap/tests/leap.rs @@ -0,0 +1,46 @@ +use leap::*; + +#[test] +fn year_not_divisible_by_4_in_common_year() { + assert!(!is_leap_year(2015)); +} + +#[test] +fn year_divisible_by_2_not_divisible_by_4_in_common_year() { + assert!(!is_leap_year(1970)); +} + +#[test] +fn year_divisible_by_4_not_divisible_by_100_in_leap_year() { + assert!(is_leap_year(1996)); +} + +#[test] +fn year_divisible_by_4_and_5_is_still_a_leap_year() { + assert!(is_leap_year(1960)); +} + +#[test] +fn year_divisible_by_100_not_divisible_by_400_in_common_year() { + assert!(!is_leap_year(2100)); +} + +#[test] +fn year_divisible_by_100_but_not_by_3_is_still_not_a_leap_year() { + assert!(!is_leap_year(1900)); +} + +#[test] +fn year_divisible_by_400_is_leap_year() { + assert!(is_leap_year(2000)); +} + +#[test] +fn year_divisible_by_400_but_not_by_125_is_still_a_leap_year() { + assert!(is_leap_year(2400)); +} + +#[test] +fn year_divisible_by_200_not_divisible_by_400_in_common_year() { + assert!(!is_leap_year(1800)); +}