Problème avec les dates palindromes futures

Fermé
bh_france Messages postés 8 Date d'inscription vendredi 1 février 2019 Statut Membre Dernière intervention 23 juillet 2023 - 9 déc. 2022 à 12:59
 niflo - 9 déc. 2022 à 20:13

Bonjour,

Je fais appel à vous car j'ai un problème mystérieux. J'ai codé un algorithme avec la fonction "getNextPalindromes" pour obtenir les prochaines dates palindromes à partir d'aujourd'hui. Je suis vraiment sûr de ce que j'ai fait.

Voici le code:

PS : Concentrez juste sur les fonctions getNextPalindromes et getNextDay. Les autres fonctions marche bien.

// ---- ETAPE 1 ----
function maxDaysInMonth(day, month) 
{
    const monthO = {"01": 31, "02": 28, "03": 31, "04": 30, "05": 31, "06": 30, "07": 31, "08": 31, 
    "09": 30, "10": 31, "11": 30, "12": 31};

    for(let [element, key] of Object.entries(monthO))
    {
        if(element === month) 
        {
            if(!(parseInt(day) > key)) 
            {
                return true;
            } 
        }
    }
    return false
}

function isValidDate(date) 
{
    let day = date.slice(0,2);
    let month = date.slice(3,5);
    let year = parseInt(date.slice(6,10))
    
    if(maxDaysInMonth(day, month))
    {
        if(year > 999 && year < 9999) 
        {
            return true;
        }
    }
    return false;
}

// ---- ETAPE 2 ----

// Faire appel de la fonction isValidDate
// Separer le jour et les deux derniers chiffres de l'annee dans des variables
// Créer condition pour savoir :
// - Si le 2nd chiffre du jour correspond au 1er de l'année
// - Si le 1er chiffre du jour correspond au 2ème de l'année

function isPalindrome(date) 
{
    if(isValidDate(date)) 
    {
        let day1 = date[0];
        let day2 = date[1];
        let day3 = date[3];
        let day4 = date[4];
        let yA = date[6];
        let yB = date[7];
        let y1 = date[date.length - 2];
        let y2 = date[date.length - 1];
        
        if(day1 == y2 && day2 == y1 && day4 == yA && day3 == yB) return true;
        return false;
    }
    return false;
}

// ---- ETAPE 3 ----

function getNextDay(i, date) {
    date.setDate(i)
    return date.toLocaleDateString("fr")
}

let tabPalindrom = [];
let index = 0;
function getNextPalindromes(x) 
{
    if(x == 0) {
        return (function() {
            for(let index of tabPalindrom) {
                console.log(index)
            }
        })();
    }   

    if(tabPalindrom.length == 0) {
        while(index >= 0) {
            let date = new Date();
            let newDay = getNextDay(index, date);
            if(isPalindrome(newDay)) {
                tabPalindrom.push(newDay)
                return getNextPalindromes(x-1)
            }
            index++
        }
    } 
    while(index >= 0) {
        const [day, year, month] = tabPalindrom[tabPalindrom.length-1].split("/")
        let date = new Date(year, month - 1, day);
        let newDay = getNextDay(index, date);
        if(isPalindrome(newDay)) {
            tabPalindrom.push(newDay)
            return getNextPalindromes(x-1)
        }
        index++
    }
}

getNextPalindromes(22);

Et voici ce que ça me retourne :

alfa@MacBook-Pro-de-Alpha ex07 % node ex07.js
03/02/2030
08/02/2080
09/02/2090
19/02/2091
10/12/2101
21/12/2112
31/12/2113
02/12/2120
12/12/2121
22/12/2122
03/12/2130
13/12/2131
23/12/2132
04/12/2140
14/12/2141
24/12/2142
05/12/2150
15/12/2151
25/12/2152
06/12/2160
16/12/2161
26/12/2162

Je ne comprends vraiment pas, je n'ai pas toutes les dates. Si quelqu'un peut m'aider ce sera vraiment le bienvenue.

Je vous remercie à tous.

2 réponses

Bonsoir, je n'y connais pas grand chose en js, mais ton code est bien trop complexe pour uniquement récupérer les dates ultérieures étant des palindromes.

Une chose déjà est que tu ne gère pas les années bissextiles, ce n'est pas cela qui doit causer le bug de ton script. Pourquoi s'ennuyer à gérer cela, alors qu'en ajoutant des jours à une date,  la date gèrera toute seule la mise à jour des mois et années, de ce fait plus besoin non plus de vérifier si ta date est valide.

De là on peut arriver à quelque chose comme (fonctionne avec nodejs dans mon terminal).

function show(obj) {
    // Ouias fonction de feignasse comme moi ^^
    console.log(obj);
}

function show_date(date, sep='/') {
    console.log(date.getDate() + sep + (date.getMonth() + 1) + sep +  date.getFullYear())
}

function date_add_days(date, days=1) {
    date.setDate(date.getDate() + days);
}

function get_day(date) {
    return date.getDate().toString().padStart(2, '0');
}

function get_month(date) {
    return (date.getMonth() + 1).toString().padStart(2, '0');
}

function get_reverse_year(date) {
    return date.getFullYear().toString().split('').reverse().join('');
}

function get_date(date, sep='/') {
    return get_day(date) + sep + get_month(date) + sep + date.getFullYear();
}

function is_palindrome_date(date) {
    return  get_day(date) + get_month(date) == get_reverse_year(date);
}

function get_date_palindromes(n) {
    const date = new Date();
    const tabPalindrom = [];
    let i = 0;
    while ( true ) {
        if ( is_palindrome_date(date) ) {
            tabPalindrom.push(get_date(date));
            i++;
            if ( i == n ) {
                break;
            }
        }
        date_add_days(date);
    }
    return tabPalindrom;
}

show(get_date_palindromes(22));

Comme tu peux constater, que de simples fonctions pour se mâcher le boulot, ainsi c'est bien plus facile à lire autant qu'à déboguer en cas de problèmes de résultats incorrects.

Bonne continuation.

0
vieu bison boiteu Messages postés 44314 Date d'inscription lundi 11 avril 2005 Statut Contributeur Dernière intervention 23 décembre 2024 Ambassadeur 3 553
9 déc. 2022 à 20:06

salut  bh_france

ce que j'ai trouvé

La dernière date palindromique universellle remonte au 2 février 2020 (02/02/2020). Mais c'était la première fois depuis le 11 novembre 1111 (11/11/1111), soit 909 ans plus tôt. Et le prochain palindrome universel aura lieu le 21 décembre 2121 (21/12/2112). Ce sera d'ailleurs le dernier du deuxième millénaire.22 févr. 2022

@+


0

Oui en effet, ce n'est pas vraiment des palindromes, plus des « miroirs » par le centre d'un texte, ici en l'occurence des dates.

0