Baccalauréat — Épreuve pratique — 2026 — NSI
Épreuve pratique NSI 2026 — Sujet 20 : empreinte carbone des usages numériques
Sujet
Épreuve pratique de NSI, session 2026 — sujet n°20 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 des usages numériques
Le numérique représente aujourd'hui environ 4 % des émissions mondiales de gaz à effet de serre, soit davantage que le transport aérien civil. Une part importante de cette empreinte provient de la fabrication des équipements, mais l'usage quotidien (streaming vidéo, envoi d'emails, stockage cloud) y contribue également de manière significative.
On souhaite développer une application permettant d'estimer l'empreinte carbone d'un utilisateur en fonction de ses usages numériques. Les émissions sont exprimées en grammes de CO₂ équivalent (gCO₂e). On dispose des données suivantes concernant les émissions moyennes de différentes activités numériques :
| Activité | Émission unitaire | Unité |
|---|---|---|
| Email sans pièce jointe | 4 | gCO₂e par email |
| Email avec pièce jointe (1 Mo) | 19 | gCO₂e par email |
| Streaming vidéo SD | 36 | gCO₂e par heure |
| Streaming vidéo HD | 100 | gCO₂e par heure |
| Recherche web | 7 | gCO₂e par recherche |
| Stockage cloud | 10 | gCO₂e par Go par mois |
Un utilisateur est représenté par un dictionnaire contenant ses usages mensuels. Par exemple :
utilisateur1 = {
'emails_simples': 150,
'emails_pj': 20,
'streaming_sd': 10, # en heures
'streaming_hd': 25, # en heures
'recherches': 500,
'stockage_cloud': 15 # en Go
}Question 1. Dans le fichier code_empreinte.py, écrire en Python le code de la fonction calculer_empreinte(utilisateur) qui prend en paramètre un dictionnaire représentant les usages d'un utilisateur (au format décrit précédemment) et qui renvoie l'empreinte carbone totale mensuelle en gCO₂e, de type entier. Par exemple, calculer_empreinte(utilisateur1) renvoie la valeur 7490.
Appel professeur — Appeler le professeur pour lui présenter votre réponse ou en cas de difficulté.
Question 2. Écrire en Python le code de la fonction classer_par_impact(utilisateur) qui prend en paramètre un dictionnaire représentant les usages d'un utilisateur et qui renvoie un dictionnaire contenant trois clés 'fort', 'moyen' et 'faible', chacune associée à une liste des noms des activités correspondantes selon les critères suivants :
- impact
'fort': émissions gCO₂e ; - impact
'moyen': émissions gCO₂e ; - impact
'faible': émissions gCO₂e.
Par exemple, pour l'utilisateur utilisateur2 ayant streaming_hd : 15 (1500 gCO₂e, impact fort), emails_simples : 100 (400 gCO₂e, impact moyen) et recherches : 10 (70 gCO₂e, impact faible), la fonction doit renvoyer :
{
'fort': ['streaming_hd'],
'moyen': ['emails_simples'],
'faible': ['recherches']
}Appel professeur — Appeler le professeur pour lui présenter votre réponse ou en cas de difficulté.
La fonction comparer(utilisateur1, utilisateur2), dont le code est fourni, prend en paramètres deux dictionnaires représentant les usages de deux utilisateurs. Elle renvoie un dictionnaire associant à chaque activité la différence des émissions entre les deux utilisateurs. Cette différence est définie comme l'émission de l'utilisateur 2 moins celle de l'utilisateur 1. Si une activité est absente chez un utilisateur, on considère que son émission vaut 0.
Question 3. Compléter le code de la fonction test_comparer en ajoutant au moins deux tests pertinents qui permettent de vérifier différents aspects du comportement de la fonction. Pour chaque test ajouté, une brève justification doit être donnée afin d'expliquer pourquoi ce cas est important à vérifier. D'autres utilisateurs peuvent être créés lors de l'écriture des tests.
Pour mieux percevoir l'écart entre les usages de deux utilisateurs, on utilise la formule ci-dessous :
La fonction comparer_v2(utilisateur1, utilisateur2), dont le code est fourni, prend en paramètres deux dictionnaires représentant les usages de deux utilisateurs. Elle renvoie un dictionnaire associant à chaque activité le pourcentage d'écart expliqué ci-dessus. Par exemple, comparer_v2(utilisateur1, utilisateur2) renvoie :
{
'emails_pj': -100.0,
'emails_simples': -33.33333333333333,
'recherches': -98.0,
'stockage_cloud': -100.0,
'streaming_hd': -40.0,
'streaming_sd': -100.0
}Dans certains cas, on constate que cette fonction provoque une erreur.
Question 4. Identifier dans quels cas l'erreur se produit et proposer une correction.
Appel professeur — Appeler le professeur pour lui présenter votre réponse ou en cas de difficulté.
Fichier fourni : code_empreinte.py
# Données d'émissions en gCO2e par unité
EMISSIONS = {
'emails_simples': 4, # par email
'emails_pj': 19, # par email avec pièce jointe
'streaming_sd': 36, # par heure
'streaming_hd': 100, # par heure
'recherches': 7, # par recherche
'stockage_cloud': 10 # par Go par mois
}
# Exemples d'utilisateurs pour les tests
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
}
utilisateur3 = {
'emails_simples': 50,
'emails_pj': 5,
'streaming_sd': 30,
'streaming_hd': 5,
'recherches': 200,
'stockage_cloud': 5
}
utilisateur4 = {
'emails_simples': 100,
'recherches': 50
}
utilisateur5 = {
'emails_simples': 50,
'recherches': 100
}
utilisateur6 = {}
#############################################################################
# Écrire le code de la fonction calculer_empreinte de la question 1 #
#############################################################################
#############################################################################
# Écrire le code de la fonction classer_par_impact de la question 2 #
#############################################################################
#############################################################################
# Fonction fournie pour la question 3 #
#############################################################################
def comparer(u1, u2):
"""Compare les émissions de deux utilisateurs pour toutes les activités.
Renvoie un dictionnaire avec, pour chaque activité, la différence des
émissions (émissions de l’utilisateur 2 moins celles de l’utilisateur 1).
Si une activité est absente chez un utilisateur, on considère que
son émission vaut 0."""
differences = {}
for activite in EMISSIONS:
quantite1 = 0
quantite2 = 0
if activite in u1:
quantite1 = u1[activite]
if activite in u2:
quantite2 = u2[activite]
emission1 = quantite1 * EMISSIONS[activite]
emission2 = quantite2 * EMISSIONS[activite]
differences[activite] = emission2 - emission1
return differences
def test_comparer():
diff = comparer(utilisateur4, utilisateur5)
assert diff['emails_simples'] == -200 # (50-100) * 4
assert diff['recherches'] == 350 # (100-50) * 7
# Ajouter vos tests ci-dessous avec justifications
#############################################################################
# Fonction fournie pour la question 4 #
#############################################################################
def comparer_v2(u1, u2):
"""Compare les émissions de deux utilisateurs pour toutes les activités.
Renvoie un dictionnaire avec, pour chaque activité, l'écart des émissions
sous forme de pourcentage, en proportion de la première émission."""
ecarts = {}
for activite in EMISSIONS:
quantite1 = 0
quantite2 = 0
if activite in u1:
quantite1 = u1[activite]
if activite in u2:
quantite2 = u2[activite]
emission1 = quantite1 * EMISSIONS[activite]
emission2 = quantite2 * EMISSIONS[activite]
ecarts[activite] = (emission2 - emission1)/emission1 * 100
return ecartsCorrigé
Créez un compte gratuit : votre première correction est offerte.