# -*- coding: utf-8 -*- """ Corrigé Python - Bac NSI 2026 - Épreuve pratique - Sujet 20 Thème : empreinte carbone numérique, dictionnaires et pourcentages """ from __future__ import annotations EMISSIONS = { "emails_simples": 4, "emails_pj": 19, "streaming_sd": 36, "streaming_hd": 100, "recherches": 7, "stockage_cloud": 10, } utilisateur1 = { "emails_simples": 150, "emails_pj": 20, "streaming_sd": 10, "streaming_hd": 25, "recherches": 500, "stockage_cloud": 15, } utilisateur2 = {"streaming_hd": 15, "emails_simples": 100, "recherches": 10} utilisateur4 = {"emails_simples": 100, "recherches": 50} utilisateur5 = {"emails_simples": 50, "recherches": 100} utilisateur6 = {} # Question 1 # -------------------------- def calculer_empreinte(utilisateur: dict) -> int: """Renvoie l'empreinte carbone totale mensuelle en gCO2e.""" total = 0 for activite, quantite in utilisateur.items(): total += quantite * EMISSIONS[activite] return total # Question 2 # -------------------------- def classer_par_impact(utilisateur: dict) -> dict[str, list[str]]: """Classe les activités selon leur niveau d'impact.""" classement = {"fort": [], "moyen": [], "faible": []} for activite, quantite in utilisateur.items(): emission = quantite * EMISSIONS[activite] if emission >= 1000: classement["fort"].append(activite) elif emission >= 200: classement["moyen"].append(activite) else: classement["faible"].append(activite) return classement # Question 3 : fonction test à compléter # -------------------------- def comparer(u1: dict, u2: dict) -> dict[str, int]: differences = {} for activite in EMISSIONS: quantite1 = u1.get(activite, 0) quantite2 = u2.get(activite, 0) emission1 = quantite1 * EMISSIONS[activite] emission2 = quantite2 * EMISSIONS[activite] differences[activite] = emission2 - emission1 return differences def test_comparer() -> None: diff = comparer(utilisateur4, utilisateur5) assert diff["emails_simples"] == -200 # (50-100) * 4 assert diff["recherches"] == 350 # (100-50) * 7 # Activité absente du premier utilisateur : son émission est considérée comme 0. diff = comparer({}, {"streaming_hd": 2}) assert diff["streaming_hd"] == 200 # Activité absente du second utilisateur : l'écart est négatif. diff = comparer({"emails_pj": 1}, {}) assert diff["emails_pj"] == -19 # Question 4 : une erreur à rectifier # -------------------------- # Si une activité est absente chez l'utilisateur 1, cela entraîne une division par 0. # On peut donc plutôt renvoyer une valeur par défaut, None par exemple. def comparer_v2(u1: dict, u2: dict) -> dict[str, float | None]: """ Renvoie le pourcentage d'écart. Si l'émission de référence est nulle, le pourcentage n'est pas défini : on renvoie None. """ ecarts = {} for activite in EMISSIONS: quantite1 = u1.get(activite, 0) quantite2 = u2.get(activite, 0) emission1 = quantite1 * EMISSIONS[activite] emission2 = quantite2 * EMISSIONS[activite] if emission1 == 0: ecarts[activite] = 0.0 if emission2 == 0 else None else: ecarts[activite] = (emission2 - emission1) / emission1 * 100 return ecarts #************** TESTS*************************** def tests() -> None: assert calculer_empreinte(utilisateur1) == 7490 assert classer_par_impact(utilisateur2) == { "fort": ["streaming_hd"], "moyen": ["emails_simples"], "faible": ["recherches"], } test_comparer() assert comparer_v2({}, {"emails_simples": 10})["emails_simples"] is None assert comparer_v2({}, {})["emails_simples"] == 0.0 print("Tous les tests du sujet 20 sont passés.") if __name__ == "__main__": tests()