
Aujourd’hui, 21/02/2012, est une date palindrome, c’est-à-dire que l’ordre des lettres reste le même qu’on le lise de gauche à droite ou de droite à gauche comme le mot « kayak » (par exemple et pris au hasard !). Je ne sais pas si vous êtes superstitieux, mais en tout cas les dates palindromes sont très rares ! La prochaine sera en effet le 02/02/2020, dans 8 ans.
J’ai eu l’idée de créer un algorithme inutile (donc indispensable) pour trouver les prochaines dates palindromes dans les X prochaines années. Je partage avec vous ce bout de code, qui ne sera surement pas très utile dans la pratique mais a au moins un intérêt théorique. Et puis comme ça vous pourrez déjà noter dans votre calendrier ces dates si exceptionnelles (ou presque !).
Code de test des dates palindromes
Cet algorithme est écrit en PHP. Pour un test sur les 20 prochaines années, on obtient le résultat suivant :

Voici le code source :
<?php
/*
* Test des dates palindromes
* Copyleft 2012 - Antoine AUGUSTI - INSA de Rouen
* www.antoine-augusti.fr - antoine@augusti.fr
*
*/
$nb_annee = '20'; // NE MODIFIEZ QUE CE PARAMETRE PUIS CHARGEZ CETTE PAGE
// A partir de cet endroit, toute modification est à vos risques et périls ;D
$nb_date_palindrome = '0';
$nb_test_palindrome = '0';
$nb_tests_max = $nb_annee * 365;
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
function number_space ($number)
{
$number_space = number_format($number, 0, ',', ' '); // Arrondi et espaces sur les milliers
return $number_space;
}
$time_start = microtime_float();
function date_is_palindrome($date)
{
if (preg_match("#[0-9]{8}$#", $date))
{
if ($date{0} == $date{7} AND $date{1} == $date{6} AND $date{2} == $date{5} AND $date{3} == $date{4})
{
return TRUE;
}
else
{
return FALSE;
}
}
else
{
return FALSE;
}
}
function convert_to_date($date)
{
$jour = substr($date, 0, 2);
$mois = substr($date, 2, 2);
$annee = substr($date, 4, 4);
$new_date = ''.$jour.'/'.$mois.'/'.$annee.'';
return $new_date;
}
// Boucle de test des dates
for ($i='1';$i <= $nb_tests_max;$i++)
{
if ($i == '1')
{
$tomorrow_timestamp = mktime(0, 0, 0, date("m") , date("d"), date("Y")); // Initialise la date lors de la première itération
}
$date = date("dmY", $tomorrow_timestamp);
// Découpage de la date
$jour = substr($date, 0, 2);
$mois = substr($date, 2, 2);
$annee = substr($date, 4, 4);
$annee_begin = substr($date, 4, 2);
$annee_last = $date{7};
if (strrev($annee_begin) <= '12' AND $annee_last <= '3' AND strrev($annee_begin) == $mois) // Permet d'effectuer moins de tests
{
$test_palindrome = date_is_palindrome($date);
$nb_test_palindrome++;
}
else
{
$test_palindrome = FALSE;
}
if ($test_palindrome == TRUE)
{
$date_palindrome = convert_to_date($date);
echo '<b>'.$date_palindrome.' est un palindrome !<br></b>';
$nb_date_palindrome++;
}
$tomorrow_timestamp = mktime(0, 0, 0, $mois , $jour+1, $annee); // Retourne le lendemain, pour recommencer la boucle
}
// Calculs pour les statistiques
$last_date = convert_to_date($date);
$pourcentage_palindrome = round($nb_date_palindrome / $nb_tests_max * 100, 4);
$pourcentage_test_palindrome = round($nb_test_palindrome / $nb_tests_max * 100, 4);
$time_end = microtime_float();
$time = round($time_end - $time_start, 8);
$nombre_de_tests_par_seconde = number_space(round($nb_tests_max / $time));
$nb_test_palindrome = number_space($nb_test_palindrome);
$nb_tests_max = number_space($nb_tests_max);
// Affichage des statistiques
echo '<br /><hr />';
echo 'La dernière date à avoir été testée est le '.$last_date.'.<br>';
echo 'Nombre de tests de palindromes effectué ('.$nb_test_palindrome.') : '.$pourcentage_test_palindrome.' % du nombre de dates total.<br>';
echo ''.$nb_date_palindrome.' dates sont des palindromes dans les '.$nb_annee.' prochaines années, soit '.$pourcentage_palindrome.' % des dates.<br>';
echo 'Page générée en '.$time.' s avec '.$nb_tests_max.' tests soit '.$nombre_de_tests_par_seconde.' tests par seconde.';
?>
Vous pouvez retrouver ce code source sur Pastebin si ceci vous semble plus clair juste ici.
Je pense avoir suffisamment détaillé le code source pour qu’il soit facilement compréhensible. Si jamais vous ne compreniez pas un passage, n’hésitez pas à me demander !
Sur ce, je vous laisse, je retourne fêter la fin de ce jour palindrome comme il se doit !