Files
TermNSI/Revisions_Rentree/TP_ZEvent.ipynb
T
2026-09-07 01:03:32 +02:00

857 lines
26 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "bf05817a",
"metadata": {},
"source": [
"# TP : Z-Event - La régie de données d'un marathon caritatif\n",
"\n",
"> **Thème** : Révisions Python - variables, fonctions, boucles, listes, dictionnaires\n",
"\n",
"---\n",
"\n",
"## Contexte\n",
"\n",
"Depuis 2016, le **Z-Event** réunit chaque année des dizaines de streamers francophones\n",
"pendant plusieurs jours d'affilée, dans un même lieu, pour récolter des dons au profit\n",
"d'une association. L'événement a été créé par **ZeratoR** et **Dach**. Le principe est\n",
"simple : les spectateurs donnent, les streamers relèvent des défis, et un compteur géant\n",
"affiche la cagnotte en direct.\n",
"\n",
"Derrière ce compteur, il y a du code. Chaque don qui tombe doit être enregistré, additionné,\n",
"attribué à la chaîne sur laquelle il a été fait, comparé aux paliers annoncés, puis réaffiché\n",
"en moins d'une seconde sur tous les écrans. C'est ce travail que vous allez faire ici.\n",
"\n",
"Vous êtes bénévole à la **régie de données** de l'événement. Votre mission : écrire les\n",
"outils Python qui alimentent le compteur et les classements.\n",
"\n",
"> Les données de ce TP (montants, pseudos, horaires, cagnottes) sont **entièrement inventées**\n",
"> pour l'exercice. Elles ne correspondent à aucune édition réelle du Z-Event.\n",
"\n",
"---\n",
"\n",
"## Objectifs pédagogiques\n",
"\n",
"- Manipuler des variables et reconnaître une erreur de type\n",
"- Écrire des fonctions qui **renvoient** une valeur au lieu de l'afficher\n",
"- Parcourir une liste avec une boucle et accumuler un résultat\n",
"- Construire et exploiter des dictionnaires, y compris des dictionnaires de listes\n",
"- Réinvestir ces notions dans les chapitres de Terminale : POO, structures linéaires, graphes\n",
"\n",
"Aucune de ces notions n'est nouvelle : tout a été vu en Première. L'objectif est de les\n",
"remettre en service après la coupure estivale.\n",
"\n",
"---\n",
"\n",
"## Les données\n",
"\n",
"Copiez ce bloc en tête de votre fichier. Toutes les parties du TP s'appuient dessus."
]
},
{
"cell_type": "code",
"id": "62c3fbf5",
"metadata": {},
"source": [
"# Toutes ces données sont inventées pour l'exercice.\n",
"objectif = 2500000\n",
"collecte = 1837450.75\n",
"\n",
"dons = [\n",
" {\"pseudo\": \"Nyx_42\", \"streamer\": \"Antoine Daniel\", \"montant\": 5.0, \"heure\": \"18:04\"},\n",
" {\"pseudo\": \"TitiLeBg\", \"streamer\": \"MisterMV\", \"montant\": 20.0, \"heure\": \"18:11\"},\n",
" {\"pseudo\": \"Camille_R\", \"streamer\": \"Joueur du Grenier\", \"montant\": 50.0, \"heure\": \"18:23\"},\n",
" {\"pseudo\": \"Nyx_42\", \"streamer\": \"Baghera Jones\", \"montant\": 15.5, \"heure\": \"18:37\"},\n",
" {\"pseudo\": \"Poulpe3000\", \"streamer\": \"Horty\", \"montant\": 2.0, \"heure\": \"18:41\"},\n",
" {\"pseudo\": \"Anonyme\", \"streamer\": \"Ultia\", \"montant\": 120.0, \"heure\": \"18:52\"},\n",
" {\"pseudo\": \"Sam_du_59\", \"streamer\": \"Antoine Daniel\", \"montant\": 10.0, \"heure\": \"19:03\"},\n",
" {\"pseudo\": \"Camille_R\", \"streamer\": \"Sylvain Levy\", \"montant\": 30.0, \"heure\": \"19:14\"},\n",
" {\"pseudo\": \"Lulu_2007\", \"streamer\": \"ZeratoR\", \"montant\": 8.5, \"heure\": \"19:20\"},\n",
" {\"pseudo\": \"TitiLeBg\", \"streamer\": \"Etoiles\", \"montant\": 45.0, \"heure\": \"19:33\"},\n",
" {\"pseudo\": \"Marion_NSI\", \"streamer\": \"Joueur du Grenier\", \"montant\": 75.0, \"heure\": \"19:47\"},\n",
" {\"pseudo\": \"Poulpe3000\", \"streamer\": \"MisterMV\", \"montant\": 12.0, \"heure\": \"19:55\"},\n",
" {\"pseudo\": \"Anonyme\", \"streamer\": \"Domingo\", \"montant\": 250.0, \"heure\": \"20:08\"},\n",
" {\"pseudo\": \"Kevin_B\", \"streamer\": \"Baghera Jones\", \"montant\": 5.0, \"heure\": \"20:16\"},\n",
" {\"pseudo\": \"Nyx_42\", \"streamer\": \"Maghla\", \"montant\": 60.0, \"heure\": \"20:29\"},\n",
" {\"pseudo\": \"Sam_du_59\", \"streamer\": \"Horty\", \"montant\": 3.5, \"heure\": \"20:38\"},\n",
" {\"pseudo\": \"Marion_NSI\", \"streamer\": \"Antoine Daniel\", \"montant\": 100.0, \"heure\": \"20:44\"},\n",
" {\"pseudo\": \"Lulu_2007\", \"streamer\": \"Alphacast\", \"montant\": 18.0, \"heure\": \"20:57\"},\n",
" {\"pseudo\": \"Camille_R\", \"streamer\": \"Ultia\", \"montant\": 40.0, \"heure\": \"21:05\"},\n",
" {\"pseudo\": \"Kevin_B\", \"streamer\": \"Ponce\", \"montant\": 22.5, \"heure\": \"21:12\"},\n",
" {\"pseudo\": \"TitiLeBg\", \"streamer\": \"Joueur du Grenier\", \"montant\": 15.0, \"heure\": \"21:26\"},\n",
" {\"pseudo\": \"Anonyme\", \"streamer\": \"MisterMV\", \"montant\": 500.0, \"heure\": \"21:39\"},\n",
" {\"pseudo\": \"Poulpe3000\", \"streamer\": \"Sylvain Levy\", \"montant\": 7.5, \"heure\": \"21:48\"},\n",
" {\"pseudo\": \"Marion_NSI\", \"streamer\": \"Baghera Jones\", \"montant\": 35.0, \"heure\": \"21:59\"},\n",
"]"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"id": "bc90ce2a",
"metadata": {},
"source": [
"---\n",
"\n",
"## Partie 1 : Le compteur (variables et types)\n",
"\n",
"### 1.1. État de la cagnotte"
]
},
{
"cell_type": "markdown",
"id": "245368be",
"metadata": {},
"source": [
"**Question 1.1** : Calculez dans une variable `pourcentage` la part de l'objectif déjà\n",
"atteinte, arrondie à deux décimales."
]
},
{
"cell_type": "code",
"id": "2052888a",
"metadata": {},
"source": [
"pourcentage = # À compléter\n",
"\n",
"print(f\"Objectif atteint à {pourcentage} %\") # Objectif atteint à 73.5 %"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"id": "b97c5eaf",
"metadata": {},
"source": [
"**Question 1.2** : Calculez dans une variable `reste` la somme qu'il manque encore pour\n",
"atteindre l'objectif."
]
},
{
"cell_type": "code",
"id": "00b6e536",
"metadata": {},
"source": [
"reste = # À compléter\n",
"\n",
"print(f\"Il manque {reste} euros\") # Il manque 662549.25 euros"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"id": "35235678",
"metadata": {},
"source": [
"### 1.2. Le piège du compteur\n",
"\n",
"Le compteur du site reçoit les montants sous forme de **chaînes de caractères**, parce qu'ils\n",
"arrivent d'un formulaire web. Le code ci-dessous ne fait donc pas ce qu'on croit."
]
},
{
"cell_type": "markdown",
"id": "729d870a",
"metadata": {},
"source": [
"**Question 1.3** : Exécutez ce code, observez le résultat, puis corrigez-le pour que\n",
"`total` contienne bien la somme des deux dons."
]
},
{
"cell_type": "code",
"id": "0ba70c50",
"metadata": {},
"source": [
"don_1 = \"25\"\n",
"don_2 = \"40\"\n",
"\n",
"total = don_1 + don_2\n",
"print(total) # affiche 2540 au lieu de 65\n",
"\n",
"# Correction :\n",
"total = # À compléter\n",
"print(total) # 65"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"id": "ca07a1b6",
"metadata": {},
"source": [
"---\n",
"\n",
"## Partie 2 : L'annonce des dons (fonctions)\n",
"\n",
"Un don qui tombe doit être annoncé à l'écran. Ces fonctions produisent les messages.\n",
"\n",
"### 2.1. Formater un don"
]
},
{
"cell_type": "markdown",
"id": "2d6d0204",
"metadata": {},
"source": [
"**Question 2.1** : Écrivez la fonction `formater_don(pseudo, montant)` qui **renvoie** la\n",
"chaîne d'annonce. Attention : elle doit la renvoyer, pas l'afficher."
]
},
{
"cell_type": "code",
"id": "91af8ea0",
"metadata": {},
"source": [
"def formater_don(pseudo, montant):\n",
" # À compléter\n",
" pass\n",
"\n",
"# Test\n",
"print(formater_don(\"Nyx_42\", 5.0)) # Nyx_42 vient de donner 5.0 euros\n",
"print(formater_don(\"Marion_NSI\", 100.0)) # Marion_NSI vient de donner 100.0 euros"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"id": "dbccc201",
"metadata": {},
"source": [
"### 2.2. Repérer les gros dons\n",
"\n",
"La régie déclenche une animation spéciale au-delà d'un certain montant."
]
},
{
"cell_type": "markdown",
"id": "e5808117",
"metadata": {},
"source": [
"**Question 2.2** : Écrivez `est_gros_don(montant, seuil)` qui renvoie `True` si le montant\n",
"est **supérieur ou égal** au seuil, `False` sinon. Le seuil vaut 50 par défaut."
]
},
{
"cell_type": "code",
"id": "927dd827",
"metadata": {},
"source": [
"def est_gros_don(montant, seuil=50):\n",
" # À compléter\n",
" pass\n",
"\n",
"# Test\n",
"print(est_gros_don(120.0)) # True\n",
"print(est_gros_don(50.0)) # True\n",
"print(est_gros_don(20.0)) # False\n",
"print(est_gros_don(20.0, 10)) # True"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"id": "88a5c245",
"metadata": {},
"source": [
"### 2.3. Les paliers\n",
"\n",
"Les organisateurs annoncent des paliers au fil de la collecte.\n",
"\n",
"| Cagnotte | Palier |\n",
"|----------|--------|\n",
"| moins de 500 000 | `\"Départ\"` |\n",
"| de 500 000 à 999 999 | `\"Palier 1\"` |\n",
"| de 1 000 000 à 1 999 999 | `\"Palier 2\"` |\n",
"| 2 000 000 et plus | `\"Objectif\"` |"
]
},
{
"cell_type": "markdown",
"id": "c0f285d0",
"metadata": {},
"source": [
"**Question 2.3** : Écrivez `palier(total)` qui renvoie le nom du palier atteint."
]
},
{
"cell_type": "code",
"id": "5a353ce4",
"metadata": {},
"source": [
"def palier(total):\n",
" # À compléter\n",
" pass\n",
"\n",
"# Test\n",
"print(palier(120000)) # Départ\n",
"print(palier(750000)) # Palier 1\n",
"print(palier(1837450.75)) # Palier 2\n",
"print(palier(2500000)) # Objectif"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"id": "fd1db284",
"metadata": {},
"source": [
"### 2.4. Le message complet"
]
},
{
"cell_type": "markdown",
"id": "0eda16ce",
"metadata": {},
"source": [
"**Question 2.4** : Écrivez `annonce_regie(pseudo, montant)` qui renvoie le message affiché\n",
"en régie. Votre fonction **doit appeler** `formater_don` et `est_gros_don` : ne recopiez pas\n",
"leur contenu.\n",
"\n",
"Le message se termine par `\" [GROS DON]\"` lorsque le montant déclenche l'animation."
]
},
{
"cell_type": "code",
"id": "63490a01",
"metadata": {},
"source": [
"def annonce_regie(pseudo, montant):\n",
" # À compléter\n",
" pass\n",
"\n",
"# Test\n",
"print(annonce_regie(\"Poulpe3000\", 2.0)) # Poulpe3000 vient de donner 2.0 euros\n",
"print(annonce_regie(\"Anonyme\", 250.0)) # Anonyme vient de donner 250.0 euros [GROS DON]"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"id": "2e4c7e7f",
"metadata": {},
"source": [
"---\n",
"\n",
"## Partie 3 : L'historique des dons (boucles et listes)\n",
"\n",
"La liste `dons` contient les vingt-quatre derniers dons enregistrés. Chaque don est un\n",
"dictionnaire à quatre clés : `pseudo`, `streamer`, `montant`, `heure`.\n",
"\n",
"### 3.1. Le total collecté"
]
},
{
"cell_type": "markdown",
"id": "3c9df8f3",
"metadata": {},
"source": [
"**Question 3.1** : Écrivez `total_dons(liste_dons)` qui renvoie la somme de tous les\n",
"montants. Utilisez une boucle et un accumulateur, pas la fonction `sum`."
]
},
{
"cell_type": "code",
"id": "b2e587a4",
"metadata": {},
"source": [
"def total_dons(liste_dons):\n",
" # À compléter\n",
" pass\n",
"\n",
"# Test\n",
"print(total_dons(dons)) # 1449.5\n",
"print(total_dons([])) # 0"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"id": "c65fb763",
"metadata": {},
"source": [
"### 3.2. Le don le plus élevé"
]
},
{
"cell_type": "markdown",
"id": "3d3882b8",
"metadata": {},
"source": [
"**Question 3.2** : Écrivez `plus_gros_don(liste_dons)` qui renvoie le **dictionnaire** du\n",
"don le plus élevé. L'usage de `max` est interdit. On suppose la liste non vide."
]
},
{
"cell_type": "code",
"id": "9eaac029",
"metadata": {},
"source": [
"def plus_gros_don(liste_dons):\n",
" # À compléter\n",
" pass\n",
"\n",
"# Test\n",
"record = plus_gros_don(dons)\n",
"print(record[\"pseudo\"], record[\"montant\"]) # Anonyme 500.0"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"id": "aa89e941",
"metadata": {},
"source": [
"### 3.3. Compter et filtrer"
]
},
{
"cell_type": "markdown",
"id": "d357b858",
"metadata": {},
"source": [
"**Question 3.3** : Écrivez `compter_gros_dons(liste_dons, seuil)` qui renvoie le nombre de\n",
"dons supérieurs ou égaux au seuil. Réutilisez `est_gros_don`."
]
},
{
"cell_type": "code",
"id": "4c02a2b9",
"metadata": {},
"source": [
"def compter_gros_dons(liste_dons, seuil=50):\n",
" # À compléter\n",
" pass\n",
"\n",
"# Test\n",
"print(compter_gros_dons(dons)) # 7\n",
"print(compter_gros_dons(dons, 100)) # 4"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"id": "fae9409f",
"metadata": {},
"source": [
"**Question 3.4** : Écrivez `donateurs(liste_dons)` qui renvoie la liste des pseudos **sans\n",
"doublon**, dans l'ordre de leur premier don."
]
},
{
"cell_type": "code",
"id": "b98464c0",
"metadata": {},
"source": [
"def donateurs(liste_dons):\n",
" # À compléter\n",
" pass\n",
"\n",
"# Test\n",
"print(donateurs(dons))\n",
"# ['Nyx_42', 'TitiLeBg', 'Camille_R', 'Poulpe3000', 'Anonyme', 'Sam_du_59', 'Lulu_2007', 'Marion_NSI', 'Kevin_B']"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"id": "87fd84e5",
"metadata": {},
"source": [
"### 3.4. Le bandeau des derniers dons\n",
"\n",
"Le site n'affiche que les tout derniers dons reçus."
]
},
{
"cell_type": "markdown",
"id": "a57d2849",
"metadata": {},
"source": [
"**Question 3.5** : Écrivez `derniers_dons(liste_dons, n)` qui renvoie les `n` derniers dons\n",
"de la liste, en utilisant une **tranche**."
]
},
{
"cell_type": "code",
"id": "769c9428",
"metadata": {},
"source": [
"def derniers_dons(liste_dons, n):\n",
" # À compléter\n",
" pass\n",
"\n",
"# Test\n",
"for don in derniers_dons(dons, 3):\n",
" print(don[\"heure\"], don[\"pseudo\"])\n",
"# 21:39 Anonyme\n",
"# 21:48 Poulpe3000\n",
"# 21:59 Marion_NSI"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"id": "9e3fe8d8",
"metadata": {},
"source": [
"---\n",
"\n",
"## Partie 4 : Le classement des chaînes (dictionnaires)\n",
"\n",
"Chaque don est attribué à la chaîne sur laquelle il a été fait. La régie tient à jour la\n",
"cagnotte de chaque streamer.\n",
"\n",
"### 4.1. La cagnotte de chaque chaîne"
]
},
{
"cell_type": "markdown",
"id": "166e98fd",
"metadata": {},
"source": [
"**Question 4.1** : Écrivez `cagnottes(liste_dons)` qui renvoie un dictionnaire associant à\n",
"chaque streamer le total des dons reçus sur sa chaîne."
]
},
{
"cell_type": "code",
"id": "1c270111",
"metadata": {},
"source": [
"def cagnottes(liste_dons):\n",
" # À compléter\n",
" pass\n",
"\n",
"# Test\n",
"totaux = cagnottes(dons)\n",
"print(totaux[\"Antoine Daniel\"]) # 115.0\n",
"print(totaux[\"Joueur du Grenier\"]) # 140.0\n",
"print(len(totaux)) # 13"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"id": "9f6b6bf5",
"metadata": {},
"source": [
"### 4.2. La chaîne en tête"
]
},
{
"cell_type": "markdown",
"id": "a759ae20",
"metadata": {},
"source": [
"**Question 4.2** : Écrivez `meilleure_chaine(totaux)` qui renvoie le nom du streamer dont\n",
"la cagnotte est la plus élevée.\n",
"\n",
"Rappel : `for cle in dictionnaire` parcourt les clés."
]
},
{
"cell_type": "code",
"id": "0a6ce0d9",
"metadata": {},
"source": [
"def meilleure_chaine(totaux):\n",
" # À compléter\n",
" pass\n",
"\n",
"# Test\n",
"print(meilleure_chaine(cagnottes(dons))) # MisterMV"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"id": "a2ee2282",
"metadata": {},
"source": [
"### 4.3. Le détail des dons\n",
"\n",
"On veut maintenant, pour chaque streamer, la **liste** des montants reçus et plus seulement\n",
"leur somme : un dictionnaire dont les valeurs sont des listes."
]
},
{
"cell_type": "markdown",
"id": "b9eac959",
"metadata": {},
"source": [
"**Question 4.3** : Écrivez `dons_par_chaine(liste_dons)` qui renvoie un dictionnaire\n",
"associant à chaque streamer la liste des montants reçus, dans l'ordre chronologique."
]
},
{
"cell_type": "code",
"id": "d47e5375",
"metadata": {},
"source": [
"def dons_par_chaine(liste_dons):\n",
" # À compléter\n",
" pass\n",
"\n",
"# Test\n",
"detail = dons_par_chaine(dons)\n",
"print(detail[\"MisterMV\"]) # [20.0, 12.0, 500.0]\n",
"print(detail[\"Baghera Jones\"]) # [15.5, 5.0, 35.0]"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"id": "f5a46137",
"metadata": {},
"source": [
"### 4.4. Le podium"
]
},
{
"cell_type": "markdown",
"id": "ea80de46",
"metadata": {},
"source": [
"**Question 4.4** : Écrivez `podium(totaux)` qui renvoie la liste des trois premiers\n",
"streamers, du plus gros total au plus petit.\n",
"\n",
"Indication : `sorted(totaux, key=..., reverse=True)` trie les clés selon un critère."
]
},
{
"cell_type": "code",
"id": "262c0672",
"metadata": {},
"source": [
"def podium(totaux):\n",
" # À compléter\n",
" pass\n",
"\n",
"# Test\n",
"print(podium(cagnottes(dons)))\n",
"# ['MisterMV', 'Domingo', 'Ultia']"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"id": "4ebedc4c",
"metadata": {},
"source": [
"---\n",
"\n",
"## Partie 5 : Le planning et les raids (synthèse)\n",
"\n",
"Un **raid**, c'est lorsqu'un streamer envoie son public sur une autre chaîne à la fin de son\n",
"passage. Cette partie combine tout ce qui précède.\n",
"\n",
"Copiez ce second bloc de données à la suite du premier."
]
},
{
"cell_type": "code",
"id": "2ed28b19",
"metadata": {},
"source": [
"planning = [\n",
" (\"Antoine Daniel\", 18, 20),\n",
" (\"MisterMV\", 20, 22),\n",
" (\"Joueur du Grenier\", 22, 24),\n",
" (\"Baghera Jones\", 0, 3),\n",
" (\"Ultia\", 3, 6),\n",
"]\n",
"\n",
"raids = {\n",
" \"Antoine Daniel\": [\"MisterMV\"],\n",
" \"MisterMV\": [\"Joueur du Grenier\", \"Horty\"],\n",
" \"Joueur du Grenier\": [\"Baghera Jones\"],\n",
" \"Baghera Jones\": [\"Ultia\"],\n",
" \"Ultia\": [],\n",
" \"Horty\": [\"Sylvain Levy\"],\n",
" \"Sylvain Levy\": [],\n",
"}"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"id": "d741bfa1",
"metadata": {},
"source": [
"### 5.1. Qui est à l'antenne\n",
"\n",
"Le planning est une liste de triplets `(streamer, heure_de_debut, heure_de_fin)`, en heures\n",
"entières sur vingt-quatre heures. Attention au créneau de Baghera Jones : il commence à\n",
"minuit, donc son heure de début est plus petite que celle de la personne qui la précède."
]
},
{
"cell_type": "markdown",
"id": "18718573",
"metadata": {},
"source": [
"**Question 5.1** : Écrivez `a_l_antenne(planning, heure)` qui renvoie le nom du streamer en\n",
"direct à cette heure, ou `None` si personne ne l'est.\n",
"\n",
"L'heure de début est incluse, l'heure de fin est exclue."
]
},
{
"cell_type": "code",
"id": "9f1639da",
"metadata": {},
"source": [
"def a_l_antenne(planning, heure):\n",
" # À compléter\n",
" pass\n",
"\n",
"# Test\n",
"print(a_l_antenne(planning, 19)) # Antoine Daniel\n",
"print(a_l_antenne(planning, 22)) # Joueur du Grenier\n",
"print(a_l_antenne(planning, 1)) # Baghera Jones\n",
"print(a_l_antenne(planning, 10)) # None"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"id": "0dbf8608",
"metadata": {},
"source": [
"### 5.2. Suivre la chaîne des raids\n",
"\n",
"Le dictionnaire `raids` associe à chaque streamer la liste de ceux vers qui il envoie son\n",
"public. Certains n'envoient personne : leur liste est vide."
]
},
{
"cell_type": "markdown",
"id": "342c85a1",
"metadata": {},
"source": [
"**Question 5.2** : Écrivez `suivre_raids(raids, depart)` qui renvoie la liste des chaînes\n",
"traversées en partant de `depart` et en suivant à chaque fois le **premier** raid, jusqu'à\n",
"tomber sur un streamer qui n'en fait aucun.\n",
"\n",
"Le point de départ fait partie du résultat."
]
},
{
"cell_type": "code",
"id": "67ef757e",
"metadata": {},
"source": [
"def suivre_raids(raids, depart):\n",
" # À compléter\n",
" pass\n",
"\n",
"# Test\n",
"print(suivre_raids(raids, \"Antoine Daniel\"))\n",
"# ['Antoine Daniel', 'MisterMV', 'Joueur du Grenier', 'Baghera Jones', 'Ultia']\n",
"print(suivre_raids(raids, \"Horty\"))\n",
"# ['Horty', 'Sylvain Levy']\n",
"print(suivre_raids(raids, \"Ultia\"))\n",
"# ['Ultia']"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"id": "f66fcb63",
"metadata": {},
"source": [
"---\n",
"\n",
"## Questions de synthèse\n",
"\n",
"Répondez en quelques lignes, sans machine.\n",
"\n",
"1. À la question 1.3, `\"25\" + \"40\"` donne `\"2540\"`. Expliquez pourquoi Python ne signale\n",
" aucune erreur alors que le résultat est faux du point de vue de la régie.\n",
"\n",
"2. À la question 3.2, pourquoi initialise-t-on `record` avec le premier don de la liste\n",
" plutôt qu'avec un montant de 0 ?\n",
"\n",
"3. Aux questions 4.1 et 4.3, on parcourt la même liste de dons mais on ne construit pas la\n",
" même structure. Dans quel cas le dictionnaire de listes est-il préférable au dictionnaire\n",
" de totaux ?\n",
"\n",
"4. La question 5.2 s'arrête lorsqu'un streamer ne fait aucun raid. Que se passerait-il si\n",
" deux streamers se renvoyaient mutuellement leur public ? Comment modifieriez-vous la\n",
" fonction pour l'éviter ?\n",
"\n",
"---\n",
"\n",
"## Ce que vous venez de réviser\n",
"\n",
"| Partie | Notion | Chapitre de Terminale concerné |\n",
"|--------|--------|--------------------------------|\n",
"| 1 | Variables, types, conversions | POO, structures linéaires |\n",
"| 2 | Fonctions, `return`, paramètre par défaut | Récursivité, Modularité |\n",
"| 3 | Boucles, accumulateur, listes, tranches | Parcours d'arbres et de graphes, tri fusion |\n",
"| 4 | Dictionnaires, dictionnaires de listes | Graphes, programmation dynamique |\n",
"| 5 | Synthèse, parcours d'un enchaînement | Graphes, Pile et File |\n",
"\n",
"La question 5.2 est un parcours de graphe : `raids` est une **liste d'adjacence**, exactement\n",
"la structure que vous utiliserez au chapitre Graphes.\n",
"\n",
"---\n",
"\n",
"## Barème indicatif\n",
"\n",
"| Partie | Points |\n",
"|--------|--------|\n",
"| Partie 1 : Le compteur | 3 |\n",
"| Partie 2 : L'annonce des dons | 5 |\n",
"| Partie 3 : L'historique des dons | 5 |\n",
"| Partie 4 : Le classement des chaînes | 4 |\n",
"| Partie 5 : Le planning et les raids | 2 |\n",
"| Questions de synthèse | 1 |\n",
"| **Total** | **20** |\n",
"\n",
"---\n",
"\n",
"Auteur : Florian Mathieu\n",
"\n",
"Licence CC BY-SA\n",
"\n",
"<a rel=\"license\" href=\"http://creativecommons.org/licenses/by-sa/4.0/\"><img alt=\"Licence Creative Commons\" style=\"border-width:0\" src=\"https://i.creativecommons.org/l/by-sa/4.0/88x31.png\" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel=\"license\" href=\"http://creativecommons.org/licenses/by-sa/4.0/\">Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 4.0 International</a>."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"name": "python",
"version": "3.11"
}
},
"nbformat": 4,
"nbformat_minor": 5
}