Mines Informatique Commune MP PC PSI 2024Sujet, corrigé et rapport du jury
Introduction à deux problèmes en communication numérique
- Programmation Python : chaînes de caractères, listes, dictionnaires
- Complexité temporelle et spatiale
- Bases de données : requêtes SQL, jointures, agrégation
- Graphes pondérés et plus courts chemins (algorithme de Dijkstra)
- Algorithmes gloutons
- Programmation dynamique
Téléchargements
Présentation du sujet
Difficulté moyenneCommunication numérique : compression par codage arithmétique et décodage par l'algorithme de ViterbiAfficher ou masquer la section
Présentation du sujet
Difficulté moyenneEn 25 questions et deux heures, le sujet traite deux problèmes de communication numérique. La première partie compresse un message par codage arithmétique, après une analyse des fréquences de caractères en Python et en SQL. La seconde modélise un canal bruité par un graphe et compare une stratégie gloutonne à l'algorithme de Viterbi, fondé sur la programmation dynamique.
- 1Partie 1 : compression du message par codage arithmétiquepremière et deuxième annéeComptage de caractères, complexité, usage des dictionnaires, requêtes SQL sur une table de fréquences, puis codage et décodage d'une chaîne par un intervalle de réels.
- 2Partie 2 : décodage à l'aide de l'algorithme de Viterbipremière et deuxième annéeModélisation du canal par un graphe, algorithme glouton et sa complexité, transformation en plus court chemin, puis programmation dynamique de bas en haut.
Difficulté moyenne. Le jury juge la longueur et la difficulté adaptées : certaines questions étaient élémentaires, d'autres, surtout en fin de sujet, demandaient une maîtrise plus fine.
L'épreuve en chiffres
Moyenne 10,96 / 20 · écart-type 4,24 · 5 100 présents · où vous situez-vous ?Afficher ou masquer la section
L'épreuve en chiffres
- Moyenne
- 10,96/ 20
- Écart-type
- 4,24
- Présents
- 5 100
- Coefficient
- 2
- Durée
- 2 h
Votre note sur 20 à ce sujet, en conditions de concours.
Source : document officiel du concours, épreuve du 15 mai 2024. Notes publiées par le concours (après harmonisation le cas échéant). Courbe : estimation par une loi normale.
Ce qu'a observé le jury
6 erreurs relevéesConfusion entre types de données · Complexités non justifiées ou incohérentes · Dictionnaires mal manipulésAfficher ou masquer la section
Ce qu'a observé le jury
6 erreurs relevéesLe sujet a bien classé les candidats, avec des copies presque vides à côté de copies excellentes. Le jury relève de nombreuses confusions entre types de données, une notion de complexité mal acquise et beaucoup d'erreurs de calcul. Certains candidats évitent systématiquement les questions de programmation, signe d'un manque d'entraînement.
Les erreurs les plus sanctionnées
- 1Confusion entre types de donnéesQ3, Q5, Q14
La méthode append a souvent été appliquée à des chaînes ou à des dictionnaires, et les guillemets des chaînes oubliés.
« réservé aux listes, avec des chaines de caractères ou des dictionnaires »
- 2Complexités non justifiées ou incohérentesQ4, Q6, Q20
Complexités exprimées en fonction de n seul au lieu de n et k, notation O mal simplifiée, absence de justification sanctionnée.
« proposent des complexités exponentielles pour un programme ne comportant qu’une boucle for »
- 3Dictionnaires mal manipulésQ7
Ajout d'un couple clé-valeur et test de présence d'une clé souvent faux, parenthèses de keys() oubliées, if/if au lieu de if/elif.
- 4Requête SQL avec agrégationQ9
Sous-requêtes alors qu'une seule requête était demandée, jointures mal maîtrisées, confusions WHERE/HAVING et SUM/COUNT.
« Plusieurs candidats proposent des sous-requêtes alors que le sujet demande explicitement UNE requête. »
- 5Dépaquetage d'un tupleQ11
Il faut stocker le tuple renvoyé par une fonction dans une variable plutôt que rappeler la fonction pour chaque composante.
« La méconnaissance du dépaquetage d’un t-uple et de la syntaxe d’assignation de plusieurs »
- 6Passage au plus court cheminQ22
Dijkstra est souvent cité, mais peu pensent à prendre l'opposé du logarithme des probabilités.
« peu de candidats pensent à utiliser l’opposé du logarithme »
Ce qui a été bien réussi
- La fonction de comptage d'occurrences (Q2) a été traitée et réussie par la majorité des candidats.
- La requête SQL simple de Q8 a été bien traitée dans l'ensemble.
- La recherche du maximum d'une liste (Q18), bien que placée en fin de sujet, a été globalement bien traitée.
- Les questions Q19, Q21 et Q23, peu abordées, ont été réussies par ceux qui y ont consacré du temps.
Conseils du jury
- S'entraîner régulièrement à écrire des programmes Python, même simples.
- Choisir des noms de variables parlants et commenter brièvement le code avec #.
- Justifier chaque complexité et vérifier sa cohérence avec la structure du programme.
- Vérifier la vraisemblance des résultats de dénombrement (Q15).
- Relire le programme officiel d'informatique commune et les rapports du jury.
Synthèse rédigée par WikiPrépa à partir du rapport officiel du jury (à télécharger en PDF). Les citations sont extraites du rapport.
Ces sujets peuvent vous intéresser
Lecture du sujet en ligne
L'énoncé complet, avec les formules et les figures, sans ouvrir le PDF.Afficher ou masquer la section
Lecture du sujet en ligne
ÉCOLE DES PONTS PARISTECH, ISAE-SUPAERO, ENSTA PARIS, TÉLÉCOM PARIS, MINES PARIS, MINES SAINT-ÉTIENNE, MINES NANCY, IMT ATLANTIQUE, ENSAE PARIS, CHIMIE PARISTECH - PSL.
Concours Mines-Télécom, Concours Centrale-Supélec (Cycle International).
CONCOURS 2024
ÉPREUVE D'INFORMATIQUE COMMUNE
Durée de l'épreuve : 2 heures
Les candidats sont priés de mentionner de façon apparente sur la première page de la copie :
INFORMATIQUE COMMUNE
Creative Commons Attribution - Pas d'Utilisation Commerciale - Pas de Modification 3.0 France.
Tout autre usage est soumis à une autorisation préalable du Concours commun Mines Ponts.
Introduction à deux problèmes en communication numérique
Introduction
- une phase de compression, durant laquelle Alice cherche à trouver la représentation la plus compacte possible du message,
- une phase d'encodage durant laquelle le message compressé est transformé en une succession de symboles transmissibles au travers du canal de communication utilisé,
- une phase de transmission durant laquelle le message encodé circule sur le canal de communication et est susceptible de subir une altération,
- une phase de décodage durant laquelle Bob décode le message qu'il a reçu, le message lui apparaît alors sous la forme compressée,
- une phase de décompression durant laquelle Bob applique l'opération réciproque de la compression opérée par Alice.
Ce modèle est décrit par le schéma de la Figure 1 :

1 Compression du message d'Alice : codage arithmétique
| Caractère | Codage binaire | Équivalent numérique |
| 'a' | 1100001 | 97 |
| 'b' | 1100010 | 98 |
| ' z ' | 1111010 | 122 |
| Caractère | Code |
| 'a' | 00 |
| 'b' | 01 |
| 'c' | 10 |
Dans un souci de compression de l'information, il est intéressant de représenter les caractères les plus fréquents par des expressions courtes et de ne plus nécessairement coder avec des codes de longueur constante chaque caractère. Dans l'exemple précédent, il est possible de coder le caractère '
Ce principe de compression est notamment utilisé par la norme JPEG2000 de compression des images. Nous ne le présenterons cependant ici que dans le cadre de l'étude de chaînes de caractères.
1.1 Analyse du texte source
- les caractères utilisés par la chaîne
s ; - le nombre d'occurrences de chacun.
def listeCaracteres(s:str):
listeCar = []
n = len(s)
for i in range(n):
c = s[i]
if not(c in listeCar):
listeCar.append(c)
return listeCar
def analyseTexte(s:str):
R = []
l = listeCaracteres(s)
for i in range(len(l)):
c = l[i]
R.append((c, nbCaracteres(c, s)))
return R
dans
i. linéaire en la longueur
ii. indépendante de
1.2 Exploitation d'analyses existantes
- caractere(idCar, symbole, typeCaractere, codeHTML);
- corpus(idLivre, titre, auteur, annee, nombreCaracteres, langue) ;
- occurrences(idCar, idLivre, nombreOccurrences);
dont voici quelques extraits :
| idCar | symbole | typeCaractere | codeHTML |
| 65 | 'A' | 'lettre' | 'A ' |
| 48 | '0' | 'nombre' | '0' |
| idLivre | titre | auteur | annee | nombreCaracteres | langue |
| 1 | 'Germinal' | 'Zola' | 1885 | 1152365 | 'Français' |
| 2 | 'Les Misérables' | 'Hugo' | 1862 | 2245300 | 'Français' |
| idCar | idLivre | nombreOccurrences |
| 62 | 31 | 155 |
| 37 | 21 | 1550 |
devra renvoyer une table à deux attributs : une colonne contenant le symbole de chaque caractère, et une autre colonne contenant le rapport entre le nombre total d'occurrences du caractère et le nombre total de caractères des textes de tout le corpus.
1.3 Compression
| Caractère |
|
|
|
|
|
| Fréquence | 0.2 | 0.1 | 0.2 | 0.4 | 0.1 |
| Intervalle |
|
|
|
|
|
- on obtient d'abord l'intervalle [
0.5; 0.9 [ correspondant au caractère ' d ' ; - le caractère '
a ' détermine alors le sous-intervalle [0.50; 0.58 [ de [0.5; 0.9 [ correspondant à la portion associée au caractère 'a '. - le caractère ' c ' détermine enfin l'intervalle [0.524; 0.540[.

1.4 Décodage
| Caractère |
|
|
|
|
|
| Fréquence | 0.2 | 0.1 | 0.2 | 0.4 | 0.1 |
| Intervalle |
|
|
|
|
|
- Q14 - Écrire une fonction decodage(x: float)->str produisant la chaîne de caractères s déterminée par la valeur de x (avec le caractère '
# ' compris).
2 Décodage du message reçu par Bob à l'aide de l'algorithme de Viterbi
2.1 Modélisation du canal de communication par un graphe
- Bob observe une suite de
N symbolesobs_0, …, obs_(N − 1) , que nous allons représenter par une liste PythonObs = [obs_0, …obs_(N − 1)] , - pour simplifier, on supposera que l'alphabet
Σ est un ensemble deK entiers consécutifs commençant à 0 , de sorte queΣ = [ [0, K − 1] ] . Par exemple siK = 3 etN = 8 , un message valide reçu par Bob pourrait être[2, 0, 0, 2, 1, 1, 0, 0] . - chacun des symboles observés
obs_t correspond à l'altération d'un symboles_t envoyé par Alice. On note[s_0, …s_(N − 1)] le message original ; pour reprendre l'exemple précédent, Alice pourrait avoir envoyé[2, 0, 0, 2, 1, 1, 2, 0] . - on connaît, pour chaque paire
(i, j) ∈ Σ^2 , la probabilitéE_(i, j) que le canal altère le symbolej en un symbolei . On stocke ces probabilités dans une liste de listes E; autrement dit,E[i][j] est la probabilité conditionnelle d'observer le symbolei sachant que le symbolej a été émis.
- on suppose également que le symbole courant
s_t envoyé par Alice a une incidence sur le symbole suivants_(t + 1) qu'elle peut envoyer, au même titre que dans une langue comme le français, la probabilité d'observer un 't ' dans un mot, n'est pas la même suivant que le caractère précédent est un 'e ' ou un 'z '.
- on crée un sommet
S_(i, j) pour chaque symbole possible0 ⩽ i ⩽ K − 1 et chaque indice d'observation0 ⩽ j ⩽ N − 1 . Chaque couche verticale dans le graphe correspond à un caractère dans le message. Chaque strate horizontale correspond à un symbole. - au niveau de la
j -ème couche verticale, les sommetsS_(i, j) pourj < N − 1 ont pour successeurs les étatsS_(k, j + 1) pour tous les symbolesk possibles, - par commodité, on ajoute un état source
σ correspondant au début du message décodé et un état cibleτ correspondant à la fin du message, ces états étant respectivement reliés à la première et la dernière couche, - le décodage du message envoyé par Alice correspond à un chemin entre
σ etτ dans ce graphe. A chaque sommet du chemin correspond une lettre décodée. Par exemple, le chemin passant parS_(0, 0), S_(2, 1), S_(0, 2), S_(1, 3) , correspond au décodage de[0, 2, 0, 1] .

- les arcs issus de la source
σ versS_(i, 0) sont pondérés parE_(obss_0, i) la probabilité d'observer le symboleobs_0 sachant que le symbolei a été émis par Alice; - les arcs arrivant à la cible
τ sont pondérés par 1 (en fin de message, on transite forcément vers l'état final), - les arcs internes entre
S_(i, j) etS_(k, j + 1) sont pondérés par la probabilitéE_(obs_(j + 1), k)P_(i, k) .
2.2 Stratégie gloutonne
initialiserGlouton(Obs:[[int]], E:[[float]], K:int)->int qui permet d'initialiser l'algorithme glouton en trouvant le sommet le plus probable parmi
def initialiserGlouton(Obs, E, K):
probasInitiales = [E[Obs[O][i]] for i in range(K)]
s, symbole = maximumListe(probasInitiales)
return symbole
glouton(Obs:[int],

2.3 Stratégie de programmation dynamique
initialiserViterbi(E:[[float]], Obs0:int, K:int, N:int)->([[float]],[[int]]) qui prend en entrée la matrice E d'émission, la valeur de la première observation ObsO, le nombre d'éléments K de
- T et argT sont de dimensions
K lignes parN colonnes, - T[i] [0] contient la valeur de
E_(obs_0, i) , -
argT[i][0] contient la valeur -1 , - les autres valeurs de T et
argT sont à 0 .
def initialiserViterbi(E, ObsO, K, N):
probasInitiales = [E[ObsO] [i] for i in range(K)]
T = [[0 for j in range(N)] for i in range(K)]
argT = [[O for j in range(N)] for i in range(K)]
for i in range(K):
T[i][0] = probasInitiales[i]
argT[i][0] = -1
return T, argT
-> ([[float]], [[int]]) qui prend comme arguments la liste des observations Obs, la matrice des probabilités de transition
donne les tableaux T et argT suivants. Indiquer la séquence d'états la plus probable.
Fin de l'épreuve.
Questions fréquentes
4 questionsSur quoi porte le sujet d'informatique commune Mines-Ponts 2024 MP PC PSI ?Afficher ou masquer la section
Questions fréquentes
4 questionsSur quoi porte le sujet d'informatique commune Mines-Ponts 2024 MP PC PSI ?
Sur la communication numérique : compression par codage arithmétique, puis décodage par l'algorithme de Viterbi. Il mobilise Python, dictionnaires, SQL, complexité, graphes, algorithmes gloutons et programmation dynamique.
Quelles erreurs le jury a-t-il relevées en informatique commune Mines 2024 ?
Des confusions entre listes, chaînes et dictionnaires (append sur une chaîne), des complexités non justifiées, des requêtes SQL mal construites (Q9), et un tuple mal dépaqueté (Q11).
Le sujet d'informatique commune Mines 2024 est-il difficile ?
Le jury le juge adapté en longueur et en difficulté : les premières questions sont élémentaires, la fin demande une compréhension plus fine, et les dernières questions ont été très peu traitées.
Combien de questions compte l'épreuve d'informatique commune Mines-Ponts 2024 ?
Le sujet comporte 25 questions réparties en deux parties, pour une durée de deux heures.
Pas de description pour le moment
