Maths & NSI

Baccalauréat — Épreuve pratique — 2026 — NSI

Épreuve pratique NSI 2026 — Sujet 05 : empreinte carbone et dictionnaires imbriqués

Sujet

Épreuve pratique de NSI, session 2026 — sujet n°05 de la banque nationale. Durée : 1 heure, sur ordinateur. Le candidat dispose de l'énoncé et de fichiers de code et de données ; il agit en autonomie et, aux « appels professeur » indiqués, présente son travail à l'examinateur ou le sollicite en cas de difficulté.

Empreinte carbone

On s'intéresse ici à la notion d'empreinte carbone, qui correspond à la production de CO₂ (un gaz à effet de serre) imputable à un individu ou à un groupe pendant une année, exprimée en kilogrammes.

Dans le cadre de la lutte contre le réchauffement climatique, le site nosgestesclimat.fr propose un simulateur permettant d'obtenir une estimation de son empreinte carbone en répondant à des questions sur sa situation et sa consommation. Les résultats sont compilés dans un dictionnaire qui associe à des catégories (logement, alimentation, etc.) l'empreinte carbone associée.

Une utilisatrice prénommée Ada a réalisé une simulation de son empreinte carbone, dont les résultats vous sont donnés dans les fichiers empreinte_ada.json sous format brut et empreinte_ada_agr.json sous forme agrégée. Le JSON est un format de fichier permettant de stocker des listes ou des dictionnaires dont les clés sont des chaînes de caractères. Le module json permet de convertir des valeurs Python en JSON et réciproquement.

Dans un premier temps, on considère les résultats sous forme agrégée, représentés par un simple dictionnaire associant à chaque catégorie un entier représentant l'empreinte carbone correspondante (en kilogrammes de CO₂).

{
  "Logement": 2660,
  "Alimentation": 1500,
  ...
}

Question 1. Compléter le corps de la fonction total_simple. Ajouter un test permettant d'afficher l'empreinte carbone totale d'Ada, en utilisant les fonctions fournies pour accéder au fichier empreinte_ada_agr.json.

Appel professeur — Appeler le professeur pour lui présenter votre réponse ou en cas de difficulté.

Le fichier réel obtenu par Ada est empreinte_ada.json, qui contient une imbrication de dictionnaires qui permet de préciser les postes de consommation. Par exemple :

{
  "Logement": {
    "Energie": {
      "Electricité": 206,
      "Cuisson": 105,
      "Chauffage individuel": 1500
    },
    "Construction": 650,
    "Location": 37,
    "Ameublement": 162
  },
  ...
}

Question 2. En utilisant la fonction est_dictionnaire qui teste la nature d'une valeur, écrire le corps de la fonction récursive total_rec qui calcule la somme des valeurs numériques présentes dans des dictionnaires imbriqués. Des tests sont fournis dans la fonction test_total_rec ; on pourra les compléter par un cas plus proche de la structure présente dans empreinte_ada.json.

Appel professeur — Appeler le professeur pour lui présenter votre réponse ou en cas de difficulté.

Ada souhaite intégrer une fonctionnalité d'alerte. Il s'agit d'identifier si une source d'émission spécifique dépasse un certain seuil jugé critique. Une fonction nommée alerte_valeur_aberrante(empreinte, limite) a été rédigée à cet effet et figure dans le fichier Python fourni. Elle est censée parcourir l'ensemble du dictionnaire, y compris les sous-catégories, et renvoyer la valeur booléenne True dès qu'une valeur strictement supérieure à la limite est rencontrée.

Question 3. Lorsqu'on exécute la fonction alerte_valeur_aberrante sur le dictionnaire complet d'Ada avec une limite fixée à 1000, elle ne détecte aucune valeur aberrante, alors que le poste "Chauffage individuel" s'élève à 1500. Expliquer précisément l'origine de cette erreur de conception et proposer une version corrigée de la fonction.

Appel professeur — Appeler le professeur pour lui présenter votre réponse ou en cas de difficulté.

Question 4. Afin de prévenir toute régression future sur la fonction alerte_valeur_aberrante corrigée, il convient de définir une stratégie de validation robuste. Proposer un jeu de tests pertinent pour cette fonction. Pour chaque cas de test envisagé, préciser la structure du dictionnaire fourni en entrée, le résultat attendu et la particularité algorithmique que ce test permet de vérifier.

Appel professeur — Appeler le professeur pour lui présenter votre réponse ou en cas de difficulté.

Fichiers fournis

Le dossier comporte une version PDF de l'énoncé, le code source de départ empreinte.py et les deux fichiers empreinte_ada.json et empreinte_ada_agr.json. Le module json doit être disponible.

empreinte.py

import json
 
########### Fonctions données ###########
 
 
def chargement_json(nom_fichier):
    """Charge le contenu d'un fichier JSON dans un dictionnaire Python renvoyé"""
    with open(nom_fichier, "r", encoding="utf8") as curseur:
        return json.load(curseur)
 
 
def est_dictionnaire(objet):
    """Teste si un objet est de type dictionnaire"""
    return isinstance(objet, dict)
 
 
##########################################
 
 
# Première fonction à implémenter après avoir découvert le fichier JSON agrégé
# Cf fichier `empreinte_ada_agr.json`
def total_simple(empreinte):
    """Fonction qui renvoie l'empreinte carbone totale d'un dictionnaire associant
    une empreinte carbone à des noms de catégories"""
    pass
 
 
# Deuxième fonction : il faut la récursivité pour le cas des sous-catégories
# Cf fichier `empreinte_ada.json`
def total_rec(empreinte):
    """Fonction récursive qui renvoie l'empreinte carbone totale représentée
    par un dictionnaire dont les valeurs peuvent aussi être des dictionnaires"""
    pass
 
 
def test_total_rec():
    test_dico1 = {"a": 1, "d": 2}
    assert total_rec(test_dico1) == 3
    test_dico2 = {"a": {"b": 1, "c": 2}, "d": {"e": 3}}
    assert total_rec(test_dico2) == 6
 
# ==========================================
# Fonction à analyser et corriger (Question 3)
# ==========================================
 
 
def alerte_valeur_aberrante(empreinte, limite):
    """
    Fonction censée déterminer si au moins une valeur du dictionnaire
    dépasse strictement la limite donnée.
    """
    for categorie, valeur in empreinte.items():
        if est_dictionnaire(valeur):
            return alerte_valeur_aberrante(valeur, limite)
        else:
            if valeur > limite:
                return True
    return False

empreinte_ada_agr.json

{
  "Logement": 2660,
  "Alimentation": 1500,
  "Transport": 708,
  "Consommation": 893,
  "Services sociétaux": 1491
}

empreinte_ada.json

{
  "Alimentation": {
    "Repas": {
      "Viande": {
        "Blanche": 296,
        "Rouge": 814
      },
      "Autre": 97
    },
    "Déchets": 152,
    "Boisson": 141
  },
  "Logement": {
    "Energie": {
      "Electricité": 206,
      "Cuisson": 105,
      "Chauffage individuel": 1500
    },
    "Construction": 650,
    "Location": 37,
    "Ameublement": 162
  },
  "Transport": {
    "Voiture": 563,
    "Avion": 92,
    "En commun": 29,
    "Vélo": 10,
    "Train": 14
  },
  "Consommation": {
    "Textile": 418,
    "Loisirs": 168,
    "Produits manufacturés neufs": 121,
    "Electronique": {
      "Electroménager": 70,
      "Numérique": 90
    },
    "Consommables": 26
  },
  "Services sociétaux": {
    "Public": 1300,
    "Marchand": 191
  }
}

Corrigé

Corrigé réservé aux abonnés Premium.

Créez un compte gratuit : votre première correction est offerte.

Sujet officiel de la banque nationale de sujets 2026 de l'épreuve pratique de NSI (ministère de l'Éducation nationale, sujets.examens-concours.gouv.fr). Corrigé rédigé pour ce site.