Top piège du sujet
Style récursif au lieu d'impératif, majoritairement échoué
Statistiques jury
Comment les candidats s'en sont sortis
Notes brutes officielles publiées par le jury — non harmonisées.
Moyenne
10.40
Médiane
10.4
Écart-type
3.30
Q1 (25%)
8.2
Q3 (75%)
12.6
Candidats présents
—
Comparaison
Comment ce sujet se compare aux autres
Moyenne en hausse de +1.04 par rapport à 2022 (10.4 vs 9.36). Écart-type plus resserré (σ 3.72 → 3.3), notes moins dispersées. Sujet plus accessible que la session précédente.
Calculateur
Où je me situe sur ce sujet ?
Entrez votre note brute. Le percentile et la position se mettent à jour en temps réel.
Analyse
Ce qu'a observé le jury
Synthèse Hadamard du rapport officiel — citations, chiffres et conseils du jury.
Présentation du sujet
Sujet Python de 2h. Structure de données 'texte' = liste de caractères. Partie I : différentiels par positions fixes (textes de même taille), comparaison, dictionnaires de différences, application/retrait de différences, historique. Partie II/III : distance de Levenshtein (édition), programmation dynamique en matrice (n+1)×(m+1), reconstruction du chemin optimal, modélisation comme plus court chemin, Dijkstra avec file de priorité.
Structure de l'épreuve
- Partie I — Partie I, Différentiels par positions fixes (textes de même taille)(Q1-Q9)Niveau attendu
Test d'égalité (Q1), comparaison caractère par caractère (Q2), dictionnaire de différences (Q3), construction de tranches modifiées (Q4-Q5), application sans modification en place (Q5-Q6), historique avec append/pop (Q7). Q1-Q9 : 88-100 % de copies, moyennes 0.64-0.93/1.
- Partie II — Partie II, Distance d'édition (Levenshtein) en programmation dynamique(Q10-Q13)Difficile
Matrice de coûts (n+1)×(m+1), erreur fréquente de travailler sur n×m. Q9 : récurrence à 3 cas. Q11 : reconstruction du chemin en partant de (n+1, m+1) et remontant, pas de (0,0). Q10 : 74,8 % traitée, moyenne 0,57.
- Partie III — Partie III, Modélisation graphe et plus court chemin (Dijkstra)(Q14-Q17)Très difficile
Caractérisation des sommets visités par Dijkstra. Pondérations des arcs : coût d'édition = 1, M ne sert pas. Files de priorité avec ajoute() et extraire_min(), log à inclure dans la complexité. Q13-Q17 : 2,5-25 % traitée, peu réussies (moyennes 0,15-0,55).
Analyse globale du jury
« Sujet Python obligatoire sur la gestion de versions de grands textes. Note moyenne des candidats français admissibles : 10,40/20, écart-type 3,30. En grande majorité, la syntaxe Python est maîtrisée. Toutes les questions se résolvaient en style impératif (boucles for, quelques while), les candidats utilisant un style récursif ont majoritairement échoué. Lisibilité importante : noms de variables aidant le lecteur. Cas de base inutiles (texte vide) à éviter. Dépassements de bornes fréquents : while texte1[i] == texte2[i] and i < len(texte1), la comparaison est exécutée avant la vérification de la borne. Utiliser les fonctions début(tr), avant(tr) et non les indices. »
Top pièges sanctionnés
Style récursif au lieu d'impératif, majoritairement échoué-2 pts
« Toutes les questions de ce sujet se résolvaient naturellement avec des fonctions écrites en style impératif : boucles for, quelques boucles while. Les candidats qui ont tenté d'utiliser un style récursif pour certaines questions ont majoritairement échoué. »
Dépassement de bornes : comparaison avant test d'index dans while-2 pts
« Il faut veiller aux dépassements de bornes de listes. Attention, dans while texte1[i] == texte2[i] and i < len(texte1) : il y a un dépassement puisque la comparaison texte1[i] == texte2[i] est exécutée avant d'avoir vérifié la borne. »
Modifier le texte en place au lieu de le recopier (Q5)-2 pts
« La fonction ne doit pas modifier le texte en place, mais le recopier. Attention, l'instruction texte2 = texte1 ne recopie pas le texte1. »
Complexité O(len(texte1)*len(diff)) au lieu de O(len(texte1)) (Q5)-2 pts
« Certains candidats donnent une complexité en O(len(texte1)*len(diff)). Il faut remarquer que, même s'il y a deux boucles imbriquées, le nombre total de passages dans la boucle la plus interne est bien O(len(texte1)). »
Récurrence Levenshtein incorrecte M[i+1][j+1] = M[i+1][j] + M[i][j+1] - M[i][j] (Q9)-3 pts
« La solution proposée par plusieurs copies 'quand texte1[i] != texte2[i], M[i+1][j+1] = M[i+1][j] + M[i][j+1] - M[i][j]' est fausse. Contre exemple : texte1 = ['e', ' ', 'c', 'h', 'a', 't'], texte2 = ['h', 'i', 'e'], cette approche donne 3, la bonne réponse est 5. »
Chapitres clés à maîtriser
Bosse chaque chapitre sur d'autres sujets de concours qui le couvrent.
Contexte
L'épreuve en quelques chiffres
Accompagnement personnalisé
Travaillez ce sujet avec un prof de l'équipe
Nos professeurs anciens taupins (Polytechnique, ENS, Centrale) reprennent ce sujet avec toi en cours particulier — corrigé ligne par ligne, méthode, pièges évités.
Trouvez le prof qu'il vous faut
Échangez avec notre équipe pour trouver le professeur idéal selon vos besoins.
Stratégie
Notre approche pour ce sujet
- Partie I, Différentiels par positions fixes (textes de même taille) (Q1-Q9 · moyen)
- Partie II, Distance d'édition (Levenshtein) en programmation dynamique (Q10-Q13 · dur)
- Partie III, Modélisation graphe et plus court chemin (Dijkstra) (Q14-Q17 · tres-dur)
Conseils du jury
Pièges sanctionnés par le rapport
- Style récursif au lieu d'impératif, majoritairement échoué : « Toutes les questions de ce sujet se résolvaient naturellement avec des fonctions écrites en style impératif : boucles for, quelques boucles while. Les candidats qui ont tenté d'utiliser un style récursif pour certaines questions ont majoritairement échoué. »
- Dépassement de bornes : comparaison avant test d'index dans while : « Il faut veiller aux dépassements de bornes de listes. Attention, dans while texte1[i] == texte2[i] and i < len(texte1) : il y a un dépassement puisque la comparaison texte1[i] == texte2[i] est exécutée avant d'avoir vérifié la borne. »
- Modifier le texte en place au lieu de le recopier (Q5) : « La fonction ne doit pas modifier le texte en place, mais le recopier. Attention, l'instruction texte2 = texte1 ne recopie pas le texte1. »
- Complexité O(len(texte1)*len(diff)) au lieu de O(len(texte1)) (Q5) : « Certains candidats donnent une complexité en O(len(texte1)*len(diff)). Il faut remarquer que, même s'il y a deux boucles imbriquées, le nombre total de passages dans la boucle la plus interne est bien O(len(texte1)). »
- Récurrence Levenshtein incorrecte M[i+1][j+1] = M[i+1][j] + M[i][j+1] - M[i][j] (Q9) : « La solution proposée par plusieurs copies 'quand texte1[i] != texte2[i], M[i+1][j+1] = M[i+1][j] + M[i][j+1] - M[i][j]' est fausse. Contre exemple : texte1 = ['e', ' ', 'c', 'h', 'a', 't'], texte2 = ['h', 'i', 'e'], cette approche donne 3, la bonne réponse est 5. »
Ressources
Téléchargements
Sujet officiel, corrigé Hadamard et rapport jury — tout en un endroit.
FAQ