Il y a des mystères du quotidien auxquels on ne pense pas toujours. Pourquoi février a-t-il parfois 29 jours ? Qu’est-ce qui rend une année « bissextile » ? Derrière cette question, se cachent des siècles d’histoire, d’astronomie et… un petit défi algorithmique parfait pour s’initier à la logique en programmation.
Un peu d’histoire et de logique
L’année bissextile, c’est un ajustement du calendrier pour coller au plus près de la durée réelle de la révolution de la Terre autour du Soleil.
Mais comment savoir si une année est bissextile ?
La règle :
- Une année est bissextile si elle est divisible par 4 et non divisible par 100,
- ou si elle est divisible par 400.
Autrement dit, 2000 est bissextile, 1900 ne l’est pas, 2024 l’est, 2023 ne l’est pas.
Traduire la règle en code OCaml
Écrire ce test en OCaml, c’est transformer la logique en instructions précises :
let is_bissextile year =
if year mod 4 = 0 && year mod 100 <> 0 || year mod 400 = 0 then
true
else
false
Signature du programme :
val is_bissextile : int -> bool = <fun>
On aurait pu écrire ce test sur une seule ligne, mais pour la clarté et la pédagogie, il est parfois préférable de détailler la logique.
Exemples d’utilisation
Essayons la fonction sur quelques cas classiques :
is_bissextile 2024;;
: bool = true
is_bissextile 2023;;
: bool = false
is_bissextile 2000;;
: bool = true
is_bissextile 1900;;
: bool = false
Pour aller plus loin : version compacte
Pour les amateurs de concision, on peut écrire directement :
let is_bissextile year =
(year mod 4 = 0 && year mod 100 <> 0) || year mod 400 = 0
Essayez par vous-même !
Vous pouvez tester ce code directement dans votre compilateur ou interpréteur OCaml (ocamlc
, ocamlopt
) ou en ligne sur :
https://try.ocamlpro.com/
Astuce : Pour créer un calendrier perpétuel ou générer des dates valides, savoir détecter une année bissextile est indispensable. C’est aussi un excellent exercice pour s’entraîner à la logique booléenne !
La beauté de l’algorithmique, c’est de voir comment une règle millénaire peut tenir en quelques lignes de code…