ðŸŽ‰ Exercism Research is now launched. Help Exercism, help science and have some fun at research.exercism.io ðŸŽ‰

# rcmlz's solution

## to Leap in the Raku Track

Published at Apr 04 2021 · 0 comments
Instructions
Test suite
Solution

Given a year, report if it is a leap year.

The tricky thing here is that a leap year in the Gregorian calendar occurs:

``````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.

## Resources

Remember to check out the Raku documentation and 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

## Submitting Incomplete Solutions

It's possible to submit an incomplete solution so you can see how others have completed the exercise.

### leap.rakutest

``````#!/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';
}
}

=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``````
``````unit module Leap;

sub is-leap-year (\$year) is export {
\$year mod 4 == 0 and (\$year mod 100 != 0 or \$year mod 400 == 0);
}``````