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

amscotti's solution

to Leap in the OCaml Track

Published at Mar 05 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.

Getting Started

1. For library documentation, follow Useful OCaml resources.

Running Tests

A `Makefile` is provided with a default target to compile your solution and run the tests. At the command line, type:

``````make
``````

Submitting Incomplete Solutions

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

Feedback, Issues, Pull Requests

The exercism/ocaml repository on GitHub is the home for all of the Ocaml exercises.

If you have feedback about an exercise, or want to help implementing a new one, head over there and create an issue or submit a PR. We welcome new contributors!

Source

JavaRanch Cattle Drive, exercise 3 http://www.javaranch.com/leap.jsp

test.ml

``````(* leap - 1.5.1 *)
open OUnit2
open Leap

let ae exp got _test_ctxt = assert_equal exp got ~printer:string_of_bool

let tests = [
"year not divisible by 4 in common year" >::
ae false (leap_year 2015);
"year divisible by 2, not divisible by 4 in common year" >::
ae false (leap_year 1970);
"year divisible by 4, not divisible by 100 in leap year" >::
ae true (leap_year 1996);
"year divisible by 100, not divisible by 400 in common year" >::
ae false (leap_year 2100);
"year divisible by 400 in leap year" >::
ae true (leap_year 2000);
"year divisible by 200, not divisible by 400 in common year" >::
ae false (leap_year 1800);
]

let () =
run_test_tt_main ("leap tests" >::: tests)``````
``````let leap_year year =
let isDivisibleBy by = Int.rem year by = 0 in
match isDivisibleBy(4), isDivisibleBy(100), isDivisibleBy(400) with
| (true, true, true) -> true
| (true, false, _) -> true
| _ -> false``````