diff options
author | Andinus <andinus@nand.sh> | 2021-08-11 15:26:15 +0530 |
---|---|---|
committer | Andinus <andinus@nand.sh> | 2021-08-11 15:26:15 +0530 |
commit | 321825828ac918bad28d0597a8616c6dc9802c3c (patch) | |
tree | 0b8e9cb1012197750eb58e972736319b2a6abac2 /raku/leap | |
parent | 2979ef790ac5b8f58495e0dd08cafd6a3a2e30a5 (diff) | |
download | exercism-321825828ac918bad28d0597a8616c6dc9802c3c.tar.gz |
Add solved exercises
Diffstat (limited to 'raku/leap')
-rw-r--r-- | raku/leap/Leap.rakumod | 5 | ||||
-rw-r--r-- | raku/leap/README.md | 47 | ||||
-rw-r--r-- | raku/leap/leap.rakutest | 99 |
3 files changed, 151 insertions, 0 deletions
diff --git a/raku/leap/Leap.rakumod b/raku/leap/Leap.rakumod new file mode 100644 index 0000000..0df3183 --- /dev/null +++ b/raku/leap/Leap.rakumod @@ -0,0 +1,5 @@ +unit module Leap; + +sub is-leap-year ($year) is export { + $year %% 4 && ($year !%% 100 || $year %% 400); +} diff --git a/raku/leap/README.md b/raku/leap/README.md new file mode 100644 index 0000000..3fce837 --- /dev/null +++ b/raku/leap/README.md @@ -0,0 +1,47 @@ +# Leap + +Given a year, report if it is a leap year. + +The tricky thing here is that a leap year in the Gregorian calendar occurs: + +```text +on every year that is evenly divisible by 4 + except every year that is evenly divisible by 100 + unless the year is also evenly divisible by 400 +``` + +For example, 1997 is not a leap year, but 1996 is. 1900 is not a leap +year, but 2000 is. + +## Notes + +Though our exercise adopts some very simple rules, there is more to +learn! + +For a delightful, four minute explanation of the whole leap year +phenomenon, go watch [this youtube video][video]. + +[video]: http://www.youtube.com/watch?v=xX96xng7sAE + +## Resources + +Remember to check out the Raku [documentation](https://docs.raku.org/) and +[resources](https://raku.org/resources/) pages for information, tips, and +examples if you get stuck. + +## Running the tests + +There is a test suite and module included with the exercise. +The test suite (a file with the extension `.rakutest`) will attempt to run routines +from the module (a file with the extension `.rakumod`). +Add/modify routines in the module so that the tests will pass! You can view the +test data by executing the command `raku --doc *.rakutest` (\* being the name of the +test suite), and run the test suite for the exercise by executing the command +`prove6 .` in the exercise directory. + +## Source + +JavaRanch Cattle Drive, exercise 3 [http://www.javaranch.com/leap.jsp](http://www.javaranch.com/leap.jsp) + +## Submitting Incomplete Solutions +It's possible to submit an incomplete solution so you can see how others have completed the exercise. diff --git a/raku/leap/leap.rakutest b/raku/leap/leap.rakutest new file mode 100644 index 0000000..a9ab7bb --- /dev/null +++ b/raku/leap/leap.rakutest @@ -0,0 +1,99 @@ +#!/usr/bin/env raku +use Test; +use JSON::Fast; +use lib $?FILE.IO.dirname; +use Leap; +plan 9; + +my @test-cases = from-json($=pod.pop.contents).List; +for Date, DateTime { + .^method_table<is-leap-year>.wrap: sub (|) { + bail-out 'Built-in `is-leap-year` method is not allowed for this exercise.'; + }; +} + +for @test-cases -> %case { + subtest %case<description>, { + plan 2; + isa-ok ( my $result := is-leap-year %case<input><year> ), Bool; + is-deeply $result, %case<expected>, 'Result matches expected'; + } +} + +=head2 Test Cases +=begin code +[ + { + "description": "year not divisible by 4 in common year", + "expected": false, + "input": { + "year": 2015 + }, + "property": "leapYear" + }, + { + "description": "year divisible by 2, not divisible by 4 in common year", + "expected": false, + "input": { + "year": 1970 + }, + "property": "leapYear" + }, + { + "description": "year divisible by 4, not divisible by 100 in leap year", + "expected": true, + "input": { + "year": 1996 + }, + "property": "leapYear" + }, + { + "description": "year divisible by 4 and 5 is still a leap year", + "expected": true, + "input": { + "year": 1960 + }, + "property": "leapYear" + }, + { + "description": "year divisible by 100, not divisible by 400 in common year", + "expected": false, + "input": { + "year": 2100 + }, + "property": "leapYear" + }, + { + "description": "year divisible by 100 but not by 3 is still not a leap year", + "expected": false, + "input": { + "year": 1900 + }, + "property": "leapYear" + }, + { + "description": "year divisible by 400 in leap year", + "expected": true, + "input": { + "year": 2000 + }, + "property": "leapYear" + }, + { + "description": "year divisible by 400 but not by 125 is still a leap year", + "expected": true, + "input": { + "year": 2400 + }, + "property": "leapYear" + }, + { + "description": "year divisible by 200, not divisible by 400 in common year", + "expected": false, + "input": { + "year": 1800 + }, + "property": "leapYear" + } +] +=end code |