Mines Informatique Commune MP PC PSI 2023Sujet, corrigé et rapport du jury
La typographie informatisée
- Listes et listes imbriquées en Python
- Bases de données et SQL
- Images et matrices de pixels
- Algorithmes gloutons
- Programmation dynamique et mémoïsation
- Complexité des algorithmes
Téléchargements
Présentation du sujet
Difficulté moyenneTypographie informatisée : polices vectorielles, rasterisation de segments et justification de paragrapheAfficher ou masquer la section
Présentation du sujet
Difficulté moyenneEn 26 questions et deux heures, le sujet part de la description vectorielle des glyphes d'une police pour aller jusqu'à l'affichage de texte sur une image en pixels. Il mobilise une base de données en SQL, la manipulation de listes imbriquées, le tracé de segments par un algorithme de type Bresenham, puis la justification d'un paragraphe par un algorithme glouton et par programmation dynamique avec mémoïsation.
- 1Partie I : préambuleConversion d'un montant écrit en base 16 et lecture d'une description vectorielle de glyphe.
- 2Partie II : gestion de polices vectoriellesRequêtes SQL sur quatre tables : comptage, jointures et agrégation avec tri alphabétique.
- 3Partie III : manipulation de descriptions vectoriellesFonctions Python sur des listes de listes de points, calcul de largeur et transformations géométriques de glyphes passées en paramètre.
- 4Partie IV : rasterisationExécution à la main d'un tracé de segment en pixels, assertion, analyse des défauts et écriture d'un tracé continu dans tous les cas.
- 5Partie V : affichage de textePassage des coordonnées d'un glyphe aux pixels d'une page, affichage d'un caractère puis d'un mot.
- 6Partie VI : justification d'un paragrapheAlgorithme glouton, fonction coût, équation de Bellman, mémoïsation, complexité et mise en forme finale des lignes.
Difficulté moyenne. Le jury juge la longueur et la difficulté bien 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 11,14 / 20 · écart-type 3,99 · 5 086 présents · où vous situez-vous ?Afficher ou masquer la section
L'épreuve en chiffres
- Moyenne
- 11,14/ 20
- Écart-type
- 3,99
- Présents
- 5 086
- Coefficient
- 2
- Durée
- 2 h
Votre note sur 20 à ce sujet, en conditions de concours.
Source : document officiel du concours, épreuve du 5 mai 2023. 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éesSyntaxe SQL approximative · Listes imbriquées mal construites · Homothétie confondue avec une translationAfficher ou masquer la section
Ce qu'a observé le jury
6 erreurs relevéesLe sujet couvre une large part du programme d'informatique commune et a bien classé les candidats, de copies presque vides à des copies proches de la perfection. Beaucoup de copies ne traitent qu'un petit nombre de questions, ce qui révèle un manque d'entraînement à écrire du code. La présentation et la manipulation des listes restent les principaux points faibles.
Les erreurs les plus sanctionnées
- 1Syntaxe SQL approximativeQ3, Q4, Q5
COUNT sans attribut précis, jointures mal écrites avec table et attribut inversés, oubli de GROUP BY pour l'agrégation et ORDER BY mal maîtrisé.
- 2Listes imbriquées mal construitesQ10
Affectation dans une liste vide, initialisation erronée d'une liste de listes vides et erreurs sur le nombre de niveaux d'imbrication ; la liste reçue en paramètre ne devait pas être modifiée.
« le caractère modifiable des listes en Python n’est pas compris par tous. »
- 3Homothétie confondue avec une translationQ11, Q18
L'effet de la fonction zzz, une homothétie selon l'axe des abscisses, est souvent mal identifié, et la géométrie élémentaire pose encore problème en Q18.
« Le jury s’étonne de la confusion avec la notion de translation. »
- 4Range vide et assertionsQ14
Beaucoup ignorent qu'un range(a, b) avec b < a ne déclenche pas d'erreur, et peu connaissent les assertions.
« la notion d’assertion (officiellement au programme de CPGE) n’est connue que par une minorité de candidats. »
- 5Algorithme glouton mal définiQ21
La notion d'algorithme glouton est souvent confondue avec une question de complexité.
« La définition d’un algorithme glouton n’est pas connue par beaucoup : il ne s’agit pas d’une question de complexité. »
- 6Complexité déduite du nombre de bouclesQ24
La complexité du récursif naïf et de la version de bas en haut est rarement bien analysée : deux boucles imbriquées ne suffisent pas à conclure.
« ce n’est pas parce qu’il y a deux boucles imbriquées que la complexité est quadratique. »
Ce qui a été bien réussi
- La question Q2 est souvent réussie quand l'imbrication des listes est comprise.
- Les questions Q6, Q7 et Q12 sont plutôt réussies.
- La question Q22 est assez réussie par les copies qui l'ont abordée.
- Les meilleures copies ont bien compris la mémoïsation (Q23).
Conseils du jury
- S'entraîner régulièrement à écrire du code Python, même simple.
- Privilégier L.append(elt) pour ajouter un élément à une liste et ne pas modifier une liste passée en paramètre sauf demande explicite.
- Soigner la présentation du code : noms de variables clairs, commentaires brefs et pertinents, peu de ratures.
- Ne pas omettre systématiquement les parenthèses (range, len, appels de fonction), ce qui est sanctionné.
- Relire le programme officiel d'informatique commune, notamment la syntaxe SQL et les assertions.
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 2023
É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
L'énoncé de cette épreuve comporte 8 pages de texte.
La typographie informatisée
Partie I - Préambule
Voici la définition de quelques termes utiles pour la suite :
- un caractère est un signe graphique d'un système d'écriture, par exemple le caractère latin a majuscule « A ». Le standard Unicode donne à chaque caractère un nom et un identifiant numérique, appelé point de code, que nous appellerons ci-après simplement code. Le code de « A » dans la représentation Unicode est 65 . La version 13.0 publiée en mars 2020 répertorie 143859 caractères couvrant 154 systèmes d'écriture, modernes ou historiques comme les hiéroglyphes;
- un glyphe est un dessin particulier représentant un caractère, par exemple pour le caractère latin a majuscule : A (roman)
A (italique)A (caligraphié)A (gras), A (courrier)... - une police de caractères est un ensemble coordonné de glyphes incluant différentes variantes (style roman ou italique, graisse...) et permettant de représenter un texte complet dans un système d'écriture. La police de ce document est Computer Modern, la police par défaut de
AT_E X ; - une famille est un groupe de polices. La classification Vox-ATypI, proposée par Maximilien Vox en 1952 et adoptée par l'Association typographique internationale, contient 11 familles. La police Computer Modern fait partie de la famille Didone.
Le corps du glyphe est sa hauteur, la chasse est sa largeur. Le corps est décomposé en trois parties : l'œil qui contient typiquement les petites lettres, le jambage et la hampe qui recouvrent les dépassements en dessous ou au dessus de l'œil. La limite inférieure de l'œil est la ligne de base. Elle définit l'alignement des caractères. La chasse peut être fixe (polices

monospaces) ou variable.
- un point p est repéré par ses coordonnées (abscisse, ordonnée) dans le plan orthonormé classique, et sera représenté par une liste de deux flottants ;
- une multi-ligne 1 est une séquence de points reliés par des segments, représentée par une liste de points, éventuellement restreinte à un seul point ;
- la description vectorielle v d'un glyphe est un ensemble non vide de multi-lignes, représenté par une liste de multi-lignes.
Les descriptions vectorielles seront supposées normalisées de sorte que la ligne de base corresponde à l'ordonnée 0 , que la hauteur de l'œil soit 1 , et enfin que le glyphe soit collé à l'abscisse 0 , sans dépassement vers les abscisses négatives.
Partie II-Gestion de polices de caractères vectorielles
Famille décrit les familles de polices, avec fid la clé primaire entière et fnom leur nom.
Police décrit les polices de caractères disponibles, avec pid la clé primaire entière, pnom le nom de la police et fid de numéro de sa famille.
Caractere décrit les caractères, avec code la clé primaire entière, car le caractère lui-même, cnom le nom du caractère.
Glyphe décrit les glyphes disponibles, avec gid la clé primaire entière, code le code du caractère correspondant au glyphe, pid le numéro de la police à laquelle le glyphe appartient, groman un booléen vrai pour du roman et faux pour de l'italique et gdesc la description vectorielle du glyphe.
| Famille | |
| fid | fnom |
| 1 | Humane |
| 2 | Garalde |
| 3 | Réale |
| 4 | Didone |
| 5 | Mécane |
| 6 | Linéale |
|
|
|
| Police | ||
| pid | pnom | fid |
| 1 | Centaur | 1 |
| 2 | Garamond | 2 |
| 3 | Times New Roman | 3 |
| 4 | Computer Modern | 4 |
|
|
|
|
| 21 | Triangle | 6 |
|
|
|
|
| Caractere | ||
| code | car | cnom |
| 65 | A | lettre majuscule latine a |
| 66 | B | lettre majuscule latine b |
|
|
|
|
| 97 | a | lettre minuscule latine a |
| 98 | b | lettre minuscule latine b |
| 99 | c | lettre minuscule latine c |
|
|
|
|
| Glyphe | ||||
| gid | code | pid | groman | gdesc |
| 1 | 65 | 20 | True | [ [ [0, 0], [1, 2], [2, 0] ], [ [0.5, 1], [1.5, 1] ] ] |
| 2 | 65 | 20 | False | [ [ [0, 0], [2, 2], [2, 0] ], [ [1, 1], [2, 1] ] ] |
| ... |
|
|
|
|
| 501 | 97 | 21 | True | [ [ [0, 0], [0.5, 1], [1, 0], [0, 0] ] ] |
| 502 | 98 | 21 | True | [ [ [0, 2], [0, 0], [1, 0.5], [0, 1] ] ] |
| 503 | 99 | 21 | True | [ [ [1, 1], [0, 0.5], [1, 0] ] ] |
| 504 | 100 | 21 | True | [ [ [1, 2], [1, 0], [0, 0.5], [1, 1] ] ] |
|
|
|
|
|
|
Partie III - Manipulation de descriptions vectorielles de glyphes
v = [ [ [ 0, 0 ], [ 1, 1 ] ], [ [ 0, 1 ], [ 1, 0 ] ] ]
print(points(v)) # affiche la liste [ [ 0, 0 ], [ 1, 1 ], [ 0, 1 ], [ 1, 0 ] ]
l = [ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ], [ 7, 8 ] ]
print(dim(l, 1)) # affiche la liste [ 2, 4, 6, 8 ]
def applique(f:callable, l:[])->[]:
return [ f(i) for i in l ]
def incremente(i:int)->int:
return i + 1
print(applique(incremente, [ 0, 5, 8 ])) # affiche la liste [ 1, 6, 9 ]
def zzz(p:[float])->[float]:
return [ 0.5 * p[0], p[1] ]
- la nouvelle abscisse est
x + 0.5∗y ; - la nouvelle ordonnée reste
y .
Partic IV - Rasterisation
- im = Image.new (mode, size, color=0) alloue une nouvelle image matricielle, de type bitmap si mode vaut " 1 "; le tuple size donne la largeur et la hauteur de l'image en pixels; le paramètre facultatif color précise la couleur par défaut des pixels, en bitmap 1 pour blanc et 0 pour noir ;
- im.putpixel((
x, y ), 1) attribue la valeur 1 au pixel de coordonnées (x, y ) de l'image im; - im.save(nom_fichier) sauvegarde l'image dans un fichier dont on donne le nom;
- im.show() affiche l'image dans une fenêtre graphique.
from PIL import Image
im = Image.new("1", (50, 100), color=1)
for y in range(60, 65):
for x in range(5, 45):
im.putpixel((x, y), 0)
im.putpixel((x, y-20), 0)
im.save("egal.png")

from PIL import Image
from math import floor # renvoie l'entier immédiatement inférieur
def trace_quadrant_est(im:img, p0:(int), p1:(int)):
x0, y0 = p0
x1, y1 = p1
dx, dy = x1-x0, y1-y0
im.putpixel(p0, 0)
for i in range(1, dx):
p = (x0 + i, y0 + floor(0.5 + dy * i / dx))
im.putpixel(p, 0)
im.putpixel(p1, 0)
im = Image.new("1", (10, 10), color=1)
trace_quadrant_est(im, (0, 0), (6, 2))
trace_quadrant_est(im, (9, 8), (1, 9))
trace_quadrant_est(im, (3, 0), (5, 8))
im.show()
Partie V - Affichage de texte
from affiche import affiche_car
from PIL import Image
page = Image.new("1", (50, 50), color=1)
avance = affiche_car(page, "K", "Triangle", True, [ 10, 40 ], 16)
page.save("K.png")

from affiche import affiche_mot
from PIL import Image
page = Image.new("1", (110, 50), color=1)
avance = affiche_mot(page, "Gödel...", 2, "Triangle", True, [ 10, 35 ], 13)
page.save("goedel.png")
.jpg)
Partie VI - Justification d'un paragraphe

def glouton(Lmots:[int],L:int)->[[int]]:
lignes= []
nligne=[]
l=0
for c in Lmots :
if (c + l) > L:
lignes.append(nligne)
nligne=[c]
l=c+1
else:
l=l+c+1
nligne.append(c)
lignes.append(nligne)
return lignes
Cet algorithme fournit une solution mais qui n'est pas nécessairement optimale. Si on teste cet algorithme sur le paragraphe suivant extrait du lorem ipsum : ut enim ad minima veniam pour une longueur de ligne maximale
a) Découpage obtenu par l'algorithme
b) Découpage obtenu par programmation glouton dynamique
ut enim ad
ut enim
minima ad minima
veniam veniam
def cout(i:int,j:int,lmots:[int],L:int)->int:
res=sum(lmots[i:j+1])+(j-i)
if res>L:
return float("inf")
else:
return (L-res)**2
def algo_recursif(i:int,lmots:[int],L:int)->int:
if i==len(lmots):
return 0
else:
mini=float("inf")
for j in range(i+1,len(lmots)+1):
d=algo_recursif(j,lmots,L)+cout(i,j-1,lmots,L)
if d<mini:
mini=d
return mini
On définira la nouvelle fonction récursive progd_memo(i:int,lmots:[int],L:int,memo:{int:int}) avec la variable memo, dictionnaire initialisé en dehors de la fonction par memo={len(m):0}
def progd_bashaut(lmots:[int],L:int)->int:
M=[0]*(len(lmots)+1)
for i in range(len(lmots)-1,-1,-1):
mini,indi=float("inf"),-1
for j in range(i+1,len(lmots)+1):
d=M[j]+cout(i,j-1,lmots,L)
if d<mini:
mini,indi=d,j
M[i]=mini
return M[0]
def progd_bashaut(lmots:[int],L:int,t:[int])->int:
M=[0]*(len(lmots)+1)
for i in range(len(lmots)-1,-1,-1):
mini,indi=float("inf"),-1
for j in range(i+1,len(lmots)+1):
d=M[j]+cout(i,j-1,lmots,L)
if d<mini:
mini,indi=d,j
t[i]=indi
M[i]=mini
return M[-1]
La fonction lignes (mots: [str], t : [int], L:int)->[[str]] doit renvoyer une liste de listes de mots (chaque sous-liste correspond à une ligne) en fonction de la liste t donnée par l'algorithme. La fonction lignes(["Ut","enim","ad","minima","veniam"], [2,3,4,4,5],10) renvoie:
[["Ut","enim"],["ad","minima"],["veniam"]].
De même, en prenant,
t=[2, 3, 5, 5, 5, 6, 7, 9, 11, 11, 11]
L=15
mots=["Lorem","ipsum","dolor","sit","amet,","consectetur","adipiscing",
"elit.","Sed","non","risus."]
[["Lorem","ipsum"],
["dolor","sit","amet,"],
["consectetur"],
["adipiscing"],
["elit.","Sed"],
["non","risus."]]
Il reste à écrire une fonction formatage(lignesdemots:[[str]],L:int) qui renvoie une chaîne de caractères correspondant à la justification du paragraphe à partir des listes de mots par ligne lignesdemots et de la longueur maximale L d'une ligne en termes de caractères et espaces. Les retours à la ligne seront représentés par le symbole "
ut enim
ad minima
veniam
Fin de l'épreuve.
Questions fréquentes
4 questionsSur quoi porte le sujet d'informatique commune Mines MP PC PSI 2023 ?Afficher ou masquer la section
Questions fréquentes
4 questionsSur quoi porte le sujet d'informatique commune Mines MP PC PSI 2023 ?
Sur la typographie informatisée : description vectorielle des polices, requêtes SQL, tracé de segments en pixels, affichage de texte et justification d'un paragraphe par algorithme glouton et programmation dynamique.
Quelles erreurs le jury a-t-il le plus relevées en informatique commune Mines 2023 ?
Des erreurs de syntaxe SQL (COUNT, jointures, GROUP BY), une mauvaise construction des listes imbriquées, la confusion entre homothétie et translation, une définition fausse de l'algorithme glouton et des complexités mal analysées.
Quelles questions de l'informatique commune Mines 2023 étaient les plus difficiles ?
Le jury signale Q19 et Q20 comme difficiles, Q16 à Q18 et Q24 comme peu réussies, et Q25 et Q26 comme très peu abordées.
Comment préparer l'épreuve d'informatique commune Mines-Ponts ?
Le jury recommande de lire le programme officiel et les rapports, de s'entraîner à écrire du code, de maîtriser la manipulation des listes et de présenter lisiblement les programmes.
Pas de description pour le moment
