Solution de Nombres palindromes - Sujet 25 - EP NSI 2025

Moyen Officiel
Python (3.14.0)

Énoncé du problème

Exercice 1

EXERCICE 1 (10 points)

On a relevé les valeurs moyennes annuelles des températures à Paris pour la période allant de 2013 à 2019. Les résultats ont été récupérés sous la forme de deux tableaux (de type list) : l’un pour les températures, l’autre pour les années :

t_moy = [14.9, 13.3, 13.1, 12.5, 13.0, 13.6, 13.7]
annees = [2013, 2014, 2015, 2016, 2017, 2018, 2019]

Écrire la fonction annee_temperature_minimale qui prend en paramètres ces deux tableaux et qui renvoie la plus petite valeur relevée au cours de la période et l’année correspondante.

On suppose que la température minimale est atteinte une seule fois.

Exemple :

>>> annee_temperature_minimale(t_moy, annees)
(12.5, 2016)

Exercice 2

EXERCICE 2 (10 points)

Un mot palindrome peut se lire de la même façon de gauche à droite ou de droite à gauche : kayak, radar, et non sont des mots palindromes.

De même certains nombres ont des écritures décimales qui sont des palindromes : 33, 121, 345543.

L’objectif de cet exercice est d’obtenir un programme Python permettant de tester si un nombre est un nombre palindrome.

Pour remplir cette tâche, on vous demande de compléter le code des trois fonctions ci-dessous qui s’appuient les unes sur les autres :

  • inverse_chaine : qui renvoie une chaîne de caractères inversée ;
  • est_palindrome : qui teste si une chaîne de caractères est un palindrome ;
  • est_nbre_palindrome : qui teste si un nombre est un palindrome.

Compléter le code des trois fonctions ci-dessous.

def inverse_chaine(chaine):
    '''Retourne la chaine inversée'''
    resultat = ...
    for caractere in chaine:
        resultat = ...
    return resultat

def est_palindrome(chaine):
    '''Renvoie un booléen indiquant si la chaine ch
    est un palindrome'''
    inverse = inverse_chaine(chaine)
    return ...

def est_nbre_palindrome(nbre):
    '''Renvoie un booléen indiquant si le nombre nbre
    est un palindrome'''
    chaine = ...
    return est_palindrome(chaine)

Exemples :

>>> inverse_chaine('bac')
'cab'
>>> est_palindrome('NSI')
False
>>> est_palindrome('ISN-NSI')
True
>>> est_nbre_palindrome(214312)
False
>>> est_nbre_palindrome(213312)
True

Les contraintes ci-dessous sont ajoutées par la plateforme et ne font pas partie du sujet.

Exercice 1

Contraintes :

  • t_moy et annees sont deux tableaux de type list, non vides et de même longueur
  • 1 <= len(t_moy) = len(annees) <= 10^3
  • t_moy[i] est un nombre de type float (ou int), avec -10^2 <= t_moy[i] <= 10^2
  • annees[i] est un entier, avec 1000 <= annees[i] <= 3000
  • La température minimale est atteinte une seule fois : il n’y a pas d’ex aequo dans t_moy
  • La fonction renvoie un tuple (température minimale, année correspondante), dans cet ordre

Exercice 2

Contraintes :

  • inverse_chaine et est_palindrome reçoivent une chaîne de caractères str composée de caractères ASCII, la chaîne vide comprise
  • 0 <= len(chaine) <= 10^3
  • La comparaison est effectuée telle quelle : la casse, les espaces et les caractères de ponctuation sont significatifs
  • est_nbre_palindrome reçoit un entier int positif ou nul, avec 0 <= nbre <= 10^18
  • inverse_chaine renvoie une chaîne de caractères str ; est_palindrome et est_nbre_palindrome renvoient un booléen bool

Solution

Exercice 1 - l’année de la température minimale

L’idée. Les deux tableaux sont rangés en parallèle : la température t_moy[i] a été relevée pendant l’année annees[i]. Trouver l’année la plus froide revient donc à trouver à quelle position se trouve la plus petite température. On parcourt le tableau une seule fois en retenant l’indice du plus petit relevé rencontré jusqu’ici, et à la fin cet indice nous donne les deux valeurs demandées.

Un petit exemple. Pour t_moy = [14.9, 13.3, 13.1, 12.5, 13.0, 13.6, 13.7], la plus petite valeur est 12.5, à la position 3. On lit alors annees[3], qui vaut 2016 : on renvoie donc (12.5, 2016).

def annee_temperature_minimale(t_moy, annees):
    indice_min = 0
    # On retient l'indice du plus petit relevé vu jusqu'ici : le même indice
    # donne la température dans t_moy et l'année dans annees
    for i in range(1, len(t_moy)):
        if t_moy[i] < t_moy[indice_min]:
            indice_min = i
    return (t_moy[indice_min], annees[indice_min])

Explications. indice_min ne contient pas une température mais une position : c’est là tout le point de l’exercice, car seule la position permet de retrouver ensuite l’année. On la démarre à 0, c’est-à-dire qu’on suppose au départ que le premier relevé est le plus froid ; la boucle commence donc à 1, puisqu’il est inutile de comparer la case 0 avec elle-même. À chaque tour, si la température courante est plus petite que la meilleure connue, on met à jour indice_min. Le return construit enfin le tuple dans l’ordre demandé par le sujet : la température d’abord, l’année ensuite.

Exercice 2 - les nombres palindromes

L’idée. Les trois fonctions s’appuient les unes sur les autres, chacune faisant un tout petit travail. inverse_chaine construit l’envers d’une chaîne caractère par caractère : on part d’une chaîne vide et, pour chaque caractère lu de gauche à droite, on le colle devant ce qu’on a déjà accumulé. est_palindrome n’a alors plus qu’à comparer la chaîne et son envers. Et est_nbre_palindrome transforme le nombre en chaîne avec str, puis passe le relais à est_palindrome.

Un petit exemple. Pour 'bac', l’accumulation donne successivement 'b', puis 'ab', puis 'cab' : chaque nouveau caractère passe devant les précédents. Comme 'cab' est différent de 'bac', est_palindrome('bac') vaut False.

def inverse_chaine(chaine):
    '''Retourne la chaine inversée'''
    resultat = ''
    for caractere in chaine:
        # On place chaque nouveau caractère devant ceux déjà accumulés
        resultat = caractere + resultat
    return resultat

def est_palindrome(chaine):
    '''Renvoie un booléen indiquant si la chaine ch
    est un palindrome'''
    inverse = inverse_chaine(chaine)
    return inverse == chaine

def est_nbre_palindrome(nbre):
    '''Renvoie un booléen indiquant si le nombre nbre
    est un palindrome'''
    chaine = str(nbre)
    return est_palindrome(chaine)

Explications. Tout se joue dans la ligne resultat = caractere + resultat. C’est l’ordre des deux morceaux qui inverse la chaîne : en écrivant resultat + caractere, on recopierait la chaîne à l’identique. Le point de départ resultat = '' est indispensable, sinon il n’y aurait rien à quoi ajouter le premier caractère ; il donne au passage la bonne réponse pour la chaîne vide, dont l’envers est la chaîne vide.

Dans est_palindrome, inverse == chaine est déjà un booléen : on renvoie directement cette comparaison, sans passer par un if ... return True ... else ... return False. La comparaison se fait telle quelle, sans rien enlever ni transformer : c’est pourquoi est_palindrome('ISN-NSI') vaut True, car l’envers de 'ISN-NSI' est bien 'ISN-NSI', tiret compris.

Enfin est_nbre_palindrome ne refait aucun calcul : str(213312) donne la chaîne '213312', et c’est est_palindrome qui répond à sa place. C’est tout l’intérêt de découper un problème en petites fonctions qui s’appellent les unes les autres.