Maths & NSI

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 unitaireUnité
Email sans pièce jointe4gCO₂e par email
Email avec pièce jointe (1 Mo)19gCO₂e par email
Streaming vidéo SD36gCO₂e par heure
Streaming vidéo HD100gCO₂e par heure
Recherche web7gCO₂e par recherche
Stockage cloud10gCO₂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 ≥1000\geq 1000 gCO₂e ;
  • impact 'moyen' : 200≤200 \leq émissions <1000< 1000 gCO₂e ;
  • impact 'faible' : émissions <200< 200 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 :

pourcentage d’eˊcart=eˊmission2−eˊmission1eˊmission1×100\text{pourcentage d'écart} = \frac{\text{émission}_2 - \text{émission}_1}{\text{émission}_1} \times 100

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 ecarts

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.