Is Leap Year Jam

{:deps {org.clojure/clojure {:mvn/version "1.10.1"}
        ;; complient is used for autocompletion
        ;; add your libs here (and restart the runtime to pick up changes)
        compliment/compliment {:mvn/version "0.3.9"}
        tolitius/calip {:mvn/version "0.1.5"}
        }}
deps.edn
Extensible Data Notation
{:hello (clojure-version)}
0.1s
Clojure

In general terms the algorithm for calculating a leap year is as follows...

A year will be a leap year if it is divisible by 4 but not by 100. If a year is divisible by 4 and by 100, it is not a leap year unless it is also divisible by 400.

Thus years such as 1996, 1992, 1988 and so on are leap years because they are divisible by 4 but not by 100. For century years, the 400 rule is important. Thus, century years 1900, 1800 and 1700 while all still divisible by 4 are also exactly divisible by 100. As they are not further divisible by 400, they are not leap years.

Source: https://stackoverflow.com/questions/725098/leap-year-calculation

(defn x-divisible-by-y [x y]
  (zero? (mod x y)))
0.2s
Clojure
(defn leap-year? [year]
  (cond
    (and (x-divisible-by-y year 4) (x-divisible-by-y year 100) (x-divisible-by-y year 400)) true
    (and (x-divisible-by-y year 4) (not (x-divisible-by-y year 100))) true
    :else false))
0.1s
Clojure
(defn leap-year-fast? [year]
  (if (x-divisible-by-y year 4)
    (if (not (x-divisible-by-y year 100))
      true
      (x-divisible-by-y year 400))
    false))
0.0s
Clojure
(= true (leap-year? 1996) (leap-year? 1992) (leap-year? 1988) (leap-year? 2000))
0.0s
Clojure
(= false (leap-year? 1900) (leap-year? 1800) (leap-year? 1700))
0.0s
Clojure
(= true (leap-year-fast? 1996) (leap-year-fast? 1992) (leap-year-fast? 1988) (leap-year-fast? 2000))
0.0s
Clojure
(= false (leap-year-fast? 1900) (leap-year-fast? 1800) (leap-year-fast? 1700))
0.0s
Clojure
(require '[calip.core :as calip])
0.5s
Clojure
(calip/measure #{#'user/leap-year?
                 #'user/leap-year-fast?})
0.3s
Clojure
(= true (leap-year? 1996) (leap-year? 1992) (leap-year? 1988) (leap-year? 2000))
(= false (leap-year? 1900) (leap-year? 1800) (leap-year? 1700))
(= true (leap-year-fast? 1996) (leap-year-fast? 1992) (leap-year-fast? 1988) (leap-year-fast? 2000))
(= false (leap-year-fast? 1900) (leap-year-fast? 1800) (leap-year-fast? 1700))
0.3s
Clojure
Runtimes (1)