Corrigé Bac Blanc novembre 2025
Exercice 1⚓︎
-
Pour la classe Chemin,
itineraire,longueur,largeuretgrillesont des attibuts des instances de la classe.remplir_grilleet le constructeur__init__en sont des méthodes.
2.
| Text Only | |
|---|---|
1 2 | |
3.
| Python | |
|---|---|
5.
| Python | |
|---|---|
Remarque: Le sujet propose d'écrire une méthode
tracer_chemin, en POO, les méthodes spéciales__str__sont prévues pour appeler des print sur les objets. Cette démarche serait plus conforme avec la POO Python.
6.
7.
\(N(1,n)\) correspond aux nombres de chemins avec un déplacement vers le bas et \(n\) déplacements vers la droite, il y a donc plusieurs chemins possibles comme le permet de constater les appels à itineraire_aleatoire(1, 5) par exemple pour n = 5.
C'est \(N(0,n) = N(m, 0) = 1\) la réponse attendue.
Compte tenu de l'erreur dans l'ennoncé, cette question est comptée en point bonus.
8.
Pour arriver à la case de coordonnée \((m,n)\), il faut passer par la case (m - 1,n) en arrivant du haut ou par la case \((m, n - 1)\) en arrivant de la gauche. Comme ce sont les seules possibiltés, nous avons bien le nombre de chemins \(N(m,n)\) qui correspond à la somme des nombres de chemins \(N(m -1,n)\) et \(N(m, n - 1)\) par disjonction des cas.
9.
Nous allons écrire une fonction récursive, cas le plus adapté ici.
| Python | |
|---|---|
Exercice 2⚓︎
1.
ou avec une variable temp comme dans d'autres langages de plus bas niveau.2.
On applique la méthode décrite dans l'ennoncé.
| Python | |
|---|---|
3.
L’algorithme est récursif. La fonction triStooge s’appelle elle-même 3 fois. (et aussi, la condition d'arrêt sera atteinte en diminuant strictement l'écart entre i et j).
4.
Lors du premier appel, kva être calculé à partir de i et j
i = 0j = 5
Alors k = (5 - 0 + 1) // 3 = 6 // 3 = 2
5.
La fonction appelée que l'on ne compte pas effectue 3 appels, chacun de ces appels en effectue 3, et ces 9 appels en effectuent aussi 3 chacun.
Nous avons donc 3 + 9 + 27 = 39 appels.
Cela correspond au nombre de case de la figure.
6.
- case 1 : triStooge(A, 1, 3)
- case 2 : triStooge(A, 2, 3)
- case 3 : triStooge(A, 0, 3)
7.
Ce tableau permet de constater les évolutions de la liste A avant et après les appels suivants : appel global et du premier niveau de récursivité.
Dans le tableau ci-dessous la première ligne correspond à l'appel global et les 3 lignes suivantes aux 3 appels du premier niveau récursif.
Attention : la valeur de A est bien [5,6,4,2] ce qui correspond au sous-arbre complètement à gauche de la question 4. Et non [5,4,6,2] comme indiqué dans la phrase de la question.
| Appel | Valeur de A vant l'appel | Valeur de A après l'appel |
|---|---|---|
triStooge(A,0,3) |
[5,6,4,2] |
[2,4,5,6] résultat trié |
triStooge(A,0,2) |
[2,6,4,5] |
[2,4,6,5] |
triStooge(A,1,3) |
[2,4,6,5] |
[2,4,5,6] |
triStooge(A,0,2) |
[2,4,5,6] |
[2,4,5,6] |
8.
Avec les 3 appels récursifs à chaque niveau, le coût de cet algorithme est particulièrement mauvais.
Il est pire que les tris par insertion et sélection et même à bulle.
Les tri fusion et rapide ont une complexité en \(\mathcal{O}(n.log(n))\).
Exerice 3⚓︎
1.
Le caractère espace (noté _ dans l'arbre) sera codé 010
Pour décoder le mot, on descend dans l'arbre jusqu'à arriver à une feuille, puis on recommence avec la suite du mot binaire.
| Text Only | |
|---|---|
1 2 3 4 5 6 | |
3.
Un parcours en largeur d'abord permet de parcourir les feuilles par ordre de profondeur croissante. C'est donc celui qui permet ici d'obtenir les symboles par taille d'encodage croissante.
Partie B⚓︎
4.
Le total des occurrences est égal au nombre de symboles de la chaîne (22 dans l'exemple de la figure 2.) Pour avoir deux sous-groupes avec le nombre d'occurrences les plus proches possible, il faut que ces nombres soient le plus proche de la moitié (ici 11).
Dans le cas de la Figure 2., les deux sous-groupes ont un nombre d'occurrences égal à 11, c'est donc le partage optimal.
De plus l'ordre des symboles est bien conservé entre les sous-groupes et au sein de chaque sous groupe.
La profondeur de la racine étant 0, la profondeur maximale est atteinte pour les feuilles o et d et elle est de 5. La hauteur de l'arbre de la Figure 3. est 5. Dans le contexte du codage de Shannon-Fano cela correspond donc à la taille maximale en bits du codage d'un symbole.
En ASCII, la chaîne de caractères je pense, donc je suis est encodée avec 22 octets, c'est à dire 22 x 8 = 176 bits.
Le codage de Shannon-Faro demanderait ici beaucoup moins de bits :
- 4 bits pour chacun des caractères
i u c p ,qui apparaissent chacun 1 fois : 20 bits - 5 bits pour chacun des caractères
o dqui apparaissent chacun 1 fois : 10 bits - 4 bits pour chacun des caractères
n jqui apparaissent chacun 2 fois : 16 bits - 3 bits pour le caractère
squi apparait 3 fois : 9 bits - 3 bits pour le caractère
_qui apparait 4 fois : 12 bits - 2 bits pour le caractère
equi apparait 4 fois : 8 bits
Au total le codage de Shannon-Fano utilise 20 + 10 + 16 + 9 + 12 + 8 = 75 bits. C'est environ deux fois moins que le codage ASCII.
Cette performance du codage de Shannon-Fano s'explique autant par l'intérêt d'un codage préfixe qui utilise des codages plus courts pour les caractères les plus fréquents que par le nombre réduits de caractères codés dans le codage de Shannon-Fano : 12 au lieu des 128 de l'ASCII.
Merci à Ana qui a vu l'erreur du corrigé où j'avais oublié la virgule.
- Dessin
Partie C⚓︎
| Python | |
|---|---|
| Python | |
|---|---|
ou par compréhension:
| Python | |
|---|---|
Fonction shannon complétée :
| Python | |
|---|---|
La fonction récursive shannon se termine car elle possède une condition d'arrêt (len(tab) == 1) et que les appels récursifs se font sur des tableau de tailles qui décroissent strictement, au dernier appel, le tableau ne contient que le caractère et a donc pour taille 1.
On peut envisager une fonction sans le dictionnaire codage. Cependant ce dernier est utile pour ne pas avoir Ă rappeler la fonction
shannona chaque occurrence d'un symbole.