# -*- coding: utf-8 -*- """ Corrigé Python - Bac NSI 2026 - Épreuve pratique - Sujet 19 Thème : gestion de réservoirs d'eau, dictionnaires et agrégations """ from __future__ import annotations reservoirs = [ {"nom": "Nuiavai", "capacite": 100000, "volume": 55000, "district": "Tepua"}, {"nom": "Farepape", "capacite": 120000, "volume": 45000, "district": "Fare"}, {"nom": "Vaipuna", "capacite": 80000, "volume": 60000, "district": "Hiva Oro"}, {"nom": "Vaihere", "capacite": 95000, "volume": 20000, "district": "Fare"}, {"nom": "Teanavai", "capacite": 110000, "volume": 90000, "district": "Avera"}, {"nom": "Matavai", "capacite": 70000, "volume": 25000, "district": "Tepua"}, {"nom": "Anaʻitea", "capacite": 85000, "volume": 30000, "district": "Hiva Oro"}, {"nom": "Faaroa", "capacite": 60000, "volume": 40000, "district": "Avera"}, {"nom": "Vaitiare", "capacite": 105000, "volume": 95000, "district": "Fare"}, {"nom": "Motuavai", "capacite": 90000, "volume": 10000, "district": "Tepua"}, ] def taux_remplissage(reservoir: dict, changement: int = 0) -> float: volume_modifie = reservoir["volume"] + changement capacite = reservoir["capacite"] if volume_modifie < 0: volume_modifie = 0 if volume_modifie > capacite: volume_modifie = capacite return volume_modifie * 100 / capacite def est_en_penurie(reservoirs: list[dict], nom_reservoir: str) -> bool: """Renvoie True si le taux de remplissage du réservoir est strictement inférieur à 20 %.""" for reservoir in reservoirs: if reservoir["nom"] == nom_reservoir: return taux_remplissage(reservoir) < 20 return False def volume_par_district(reservoirs: list[dict]) -> dict[str, int]: """Renvoie le volume total disponible par district.""" volumes = {} for reservoir in reservoirs: district = reservoir["district"] if district not in volumes: volumes[district] = 0 volumes[district] += reservoir["volume"] return volumes def volume_moyen(reservoirs: list[dict]) -> float: """Renvoie le volume moyen disponible dans les réservoirs.""" assert len(reservoirs) > 0, "La liste doit contenir au moins un réservoir." somme = 0 for reservoir in reservoirs: somme += reservoir["volume"] return somme / len(reservoirs) def liste_districts(reservoirs: list[dict]) -> list[str]: liste = [] for r in reservoirs: if r["district"] not in liste: liste.append(r["district"]) return liste def reservoirs_par_district(reservoirs: list[dict]) -> dict[str, list[dict]]: dico = {} for r in reservoirs: district = r["district"] if district not in dico: dico[district] = [] dico[district].append(r) return dico def districts_vulnerables(reservoirs: list[dict]) -> list[str]: """Renvoie les districts dont le volume moyen est inférieur à 80 % du volume moyen global.""" moyenne_globale = volume_moyen(reservoirs) limite = 0.8 * moyenne_globale par_district = reservoirs_par_district(reservoirs) vulnerables = [] for district, liste in par_district.items(): if volume_moyen(liste) < limite: vulnerables.append(district) return vulnerables def tests() -> None: assert est_en_penurie(reservoirs, "Motuavai") is True assert est_en_penurie(reservoirs, "Nuiavai") is False volumes = volume_par_district(reservoirs) assert volumes["Tepua"] == 90000 assert volume_moyen([{"volume": 10}, {"volume": 10}]) == 10 assert volume_moyen(reservoirs) <= max(r["capacite"] for r in reservoirs) assert "Tepua" in districts_vulnerables(reservoirs) print("Tous les tests du sujet 19 sont passés.") if __name__ == "__main__": tests()