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.
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.
Makefile is provided with a default target to compile your solution and run the tests. At the command line, type:
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
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!
JavaRanch Cattle Drive, exercise 3 http://www.javaranch.com/leap.jsp
(* 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 divisible_by d n = n mod d = 0 let even_divisor_for n d = n |> divisible_by d let leap_year y = List.filter (even_divisor_for y) [4;100;400] |> function |  | [4;100;400] -> true | _ -> false
This probably isn't fast or efficient; I just wanted to try writing a clearly readable function without using if/else/when/etc, and without requiring the reader to map literal true/false values to a series of statements on a different line (my original function matched against a tuple of three booleans).