summary refs log tree commit diff stats
path: root/raku/leap
diff options
context:
space:
mode:
authorAndinus <andinus@nand.sh>2021-08-11 15:26:15 +0530
committerAndinus <andinus@nand.sh>2021-08-11 15:26:15 +0530
commit321825828ac918bad28d0597a8616c6dc9802c3c (patch)
tree0b8e9cb1012197750eb58e972736319b2a6abac2 /raku/leap
parent2979ef790ac5b8f58495e0dd08cafd6a3a2e30a5 (diff)
downloadexercism-321825828ac918bad28d0597a8616c6dc9802c3c.tar.gz
Add solved exercises
Diffstat (limited to 'raku/leap')
-rw-r--r--raku/leap/Leap.rakumod5
-rw-r--r--raku/leap/README.md47
-rw-r--r--raku/leap/leap.rakutest99
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