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.
For library documentation, follow Useful OCaml resources.
A Makefile
is provided with a default target to compile your solution and run the tests. At the command line, type:
make
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] | [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).
Level up your programming skills with 3,450 exercises across 52 languages, and insightful discussion with our volunteer team of welcoming mentors. Exercism is 100% free forever.
Sign up Learn More
Community comments