Mines Informatique 2 MPI 2023Sujet et rapport du jury
- Complexité de Kolmogoroff et calculabilité
- Codage de Huffman
- Algorithmes dichotomiques
- Langages réguliers et algébriques, lemme de l'étoile
- Automates (Glushkov)
- Parcours d'arbres et termes de De Bruijn
- Programmation fonctionnelle en OCaml
Téléchargements
- Corrigé : pas encore disponible
Présentation du sujet
DifficileComplexité de Kolmogoroff : algorithmique, langages formels et programmation OCamlAfficher ou masquer la section
Présentation du sujet
DifficileLe sujet est un problème unique en quatre sections indépendantes portant sur la complexité de Kolmogoroff de la représentation décimale de 10^(10^10). La première section introduit la définition de cette complexité et la notion de décompresseur. La deuxième s'appuie sur le codage de Huffman pour compresser une expression OCaml. La troisième analyse des fonctions censées générer des chaînes de caractères uniques. La quatrième introduit un langage proche du lambda-calcul, avec grammaire, parseur vers les termes de De Bruijn et interpréteur.
- 1Section 1 : définition de la complexité de KolmogoroffDéfinition de la complexité de Kolmogoroff dans le cadre d'une machine à mémoire infinie et de programmes OCaml, calculabilité et notion de décompresseur.
- 2Section 2 : codage de HuffmanCompression d'une expression OCaml obfusquée par codage de Huffman et majoration de la complexité de Kolmogoroff associée.
- 3Section 3 : génération de chaînes de caractères uniquesAnalyse de trois fonctions pour identifier celle qui ne répond pas aux exigences et celle dont la syntaxe est la moins risquée.
- 4Section 4 : un nouveau langage type lambda-calculÉtude de la grammaire du langage, implémentation d'un parseur vers les termes de De Bruijn puis d'un interpréteur servant de décompresseur.
Difficile. Le rapport indique explicitement qu'au regard de la difficulté du sujet, les correcteurs sont satisfaits du niveau d'un grand nombre de candidats, et plusieurs questions ont des taux de réussite faibles.
L'épreuve en chiffres
Moyenne 11,23 / 20 · écart-type 4,26 · 663 présents · où vous situez-vous ?Afficher ou masquer la section
L'épreuve en chiffres
- Moyenne
- 11,23/ 20
- Écart-type
- 4,26
- Présents
- 663
- Coefficient
- 4
- Durée
- 4 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éesManque de rigueur dans la rédaction des preuves · Lemme de l'étoile mal énoncé · Notation de Landau mal utiliséeAfficher ou masquer la section
Ce qu'a observé le jury
6 erreurs relevéesMalgré des notions ambitieuses, les correcteurs témoignent d'une bonne maîtrise et mise en application des notions au programme par la plupart des candidats, avec des intuitions fines même sur les questions difficiles. Ils relèvent toutefois un manque général de rigueur dans la rédaction des preuves et des erreurs récurrentes de programmation OCaml. Tous les candidats ont traité au moins une quinzaine de questions, 25 en moyenne sur les 38 du sujet.
Les erreurs les plus sanctionnées
- 1Manque de rigueur dans la rédaction des preuves
Beaucoup de candidats se contentent d'un descriptif approximatif sans vérifier l'ensemble des hypothèses, ni pour les récurrences ni pour les inductions structurelles.
- 2Lemme de l'étoile mal énoncéQ19
L'intuition derrière le lemme de l'étoile semble comprise, mais trop peu de candidats en écrivent l'énoncé formel et l'utilisent correctement.
« le lemme de l’étoile a été énoncé correctement par trop peu de candidat »
- 3Notation de Landau mal utilisée
Plusieurs candidats écrivent qu'un entier fixé est égal à un O(C) plutôt que d'écrire l'inégalité correspondante, confondant domination asymptotique et égalité.
- 4Automate de Glushkov mal identifiéQ14
Bien que traitée par 92 % des candidats, 60 % d'entre eux ont proposé un automate trop éloigné de celui attendu, probablement à cause d'une lecture trop rapide de la question.
« 60% d’entre eux ont proposé un automate trop éloigné de l’automate de Glushkov »
- 5Structure de données efficace peu identifiéeQ20
Pour une opération de recherche efficace, seuls 40 % des candidats ayant traité la question ont parlé d'arbre binaire de recherche et 14 % d'arbre équilibré, ce qui a surpris les correcteurs.
« Les correcteurs sont surpris de ne pas avoir des pourcentages plus élevés de bonne réponse. »
- 6Erreurs récurrentes en OCaml
Confusion entre le modulo OCaml et celui d'autres langages, tentative de modifier des chaînes de caractères immuables, ou confusion entre reconnaissance de motif et test de valeur.
Ce qui a été bien réussi
- Les programmes proposés par les candidats sont généralement de très bonne qualité, sur la forme et le fond.
- La majorité des candidats ont évoqué les indentations et retours à la ligne pour la question sur la lisibilité du code.
- Un candidat sur six ayant traité la question 16 a réussi à écrire la preuve du début à la fin avec rigueur.
Conseils du jury
- Toute fonction récursive doit comporter une condition d'arrêt.
- Préférer une solution claire et courte à une solution longue et complexe : les réponses alternatives longues sont rarement entièrement correctes.
- Respecter l'esprit du langage imposé : privilégier une approche fonctionnelle en OCaml plutôt qu'un style impératif proche du C.
- Faire attention à la complexité de sa fonction, par exemple en évitant de rappeler plusieurs fois une fonction sur les mêmes arguments.
- Bien expliciter la propriété à démontrer avant une récurrence ou une induction, énoncer l'hypothèse d'induction, et conclure par une phrase minimale.
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
Pas encore de corrigé pour ce sujet : voici des sujets proches corrigés.
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 2023
DEUXIÈME ÉPREUVE D'INFORMATIQUE
L'usage de la calculatrice et de tout dispositif électronique est interdit.
L'énoncé de cette épreuve comporte 12 pages de texte.
Cette épreuve concerne uniquement les candidats de la filière MPI.
Préliminaires
Travail attendu
1 Complexité de Kolmogoroff
- si la chaîne
x , de type string, est le code source d'une expression OCamly de type string et si l'exécution du codex se termine sans erreur, alors eval x se termine et a pour valeur de retour la valeur dey ; - sinon, eval
x ne se termine pas.
1.1 Un premier exemple
let exp10
in string_of_int (exp10 (exp10 10))
afin d'en faire une description de la chaîne de caractères
1.2 Quelques propriétés
5 - Écrire une fonction OCaml psi (m : int) : int dont la valeur de retour est l'entier
6 - Établir d'une part que, pour tout entier naturel
8 - Montrer que pour tout décompresseur
2 Estimation de la complexité grâce au décompresseur de Huffman
9 - Inférer le type OCaml de l'expression dénotée par la chaîne de caractères
- Hashtbl.create ( n : int) : ('a, 'b) Hashtbl.t crée un dictionnaire vide de taille initiale
n . - Hashtbl.add (d : ('a, 'b) Hashtbl.t) (k : 'a) (v : 'b) : unit ajoute une association entre la clé
k et la valeurv au dictionnaired . - Hashtbl.find_opt (d : ('a, 'b) Hashtbl.t) (
k : ^′ a ) : ' b option vaut Some v sile dictionnaire d possède une association entre la clék et la valeurv et vaut None sinon.
◻12 - Écrire une fonction OCaml count (x : string) : (char, int) Hashtbl.t dont la valeur de retour est un dictionnaire qui associe chaque caractèreσ ∈ Σ présent dans la chaînex à son nombre d'occurrences|x|_σ .
| 'n' | 't' | 'i' | 'l' | 'l' | 'c' | 'f' | 'h' | 'r' | 's' | '-' | '*' | '0' | '=' | 'e' | ' |
| 8 | 8 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 3 | 4 | 10 | 19 |
3 Interlude
let inc s = s := "a" ~ (!s); !s (* Commun aux 3 propositions *)
let new_string1 = (* Proposition 1 *)
let seed1 = ref "#" in
fun () -> inc seed1
let new_string2 () = (* Proposition 2 *)
let seed2 = ref "#" in
inc seed2
let seed3 = ref "#" (* Proposition 3 *)
let new_string3 () =
inc seed3
16 - Déduire de la question 15 laquelle des trois fonctions new_string1, new_string2 et new_string3 ne respecte pas la spécification. Écrire un test qui permet de discriminer la fonction erronée.
17 - Déduire de la question 15 laquelle des deux fonctions correctes restantes est plus propice à des erreurs de manipulation. Expliquer.
4 Estimation de la complexité grâce au décompresseur de De Bruijn
4.1 Construction syntaxique d'un langage
Pré-condition : Il existe une décomposition du mot
Effet : Une exception SyntaxError est levée si la pré-condition n'est pas satisfaite.
Soit finalement
type ada = V of string | A of (ada * ada) | F of (string * ada)
Le constructeur OCaml V représente les dérivations immédiates de règle
((aaa#->aab#->aab#(aba#->aba#abb#))(baa#->bab#bba#)) }\mp@code{(}\mathcal{G}

24 - Écrire une fonction OCaml parseT (w : char list) : ada * char list dont la spécification suit :
Pré-condition : Il existe une décomposition du
Valeur de retour : Couple (
Effet : Une exception SyntaxError est levée si la pré-condition n'est pas satisfaite.
4.2 Réécriture des variables et sérialisation
- StringSet.mem : string -> StringSet.t -> bool qui teste l'appartenance d'un élément à un ensemble.
- StringSet.remove : string -> StringSet.t -> StringSet.t qui retourne un ensemble privé d'un élément.
- StringSet.singleton : string -> StringSet.t qui construit un singleton à partir d'un élément.
- StringSet.union : StringSet.t -> StringSet.t -> StringSet.t qui construit l'union de deux ensembles.
- si l'arbre d'analyse
a est de la forme V v , oùv ∈ L(G_0) , alorsVL(a) est le singleton{v} ; - si l'arbre d'analyse
a est de la forme A (a1, a2), oùa_1 eta_2 sont deux arbres d'analyse, alorsVL(a) est la réunionVL(a_1) ∪ VL(a_2) ; - si l'arbre d'analyse
a est de la forme F (v, a1), oùv ∈ L(G_0) eta_1 est un arbre d'analyse, alorsVL(a) est l'ensembleVL(a_1)∖{v} .
◻29 - Écrire une fonction OCaml free_vars (a : ada) : StringSet.t dont la valeur de retour est l'ensemble des variables libres de l'arbre d'analysea .
type
Nous notons
Voici un exemple de construction d'un terme de De Bruijn (à droite) à partir d'un arbre d'analyse (à gauche) du mot
(aa#->ab#->ba#->bb#->(ab#((bb#aa#)ab#))bb#->(bb#aa#->(bb#->bb#aa#))):

- si le terme
t ∈ 𝒯 est de la formeVdb u, avecu ∈ ℕ^⋆ , alorstˆ est la chaîne de caractères11..10 (avec le symbole 1 répétéu fois). - si le terme
t ∈ 𝒯 est de la formeAdb(t1, t2), t_1 ett_2 étant deux termes de De Bruijn, alorst^ est la chaîne de caractères01t_1^t_2^ . - si le terme
t ∈ 𝒯 est de la forme Fdb t1, oùt_1 est un terme de De Bruijn, alorstˆ est la chaîne de caractères00t_1 ˆ .
◻32 - Soientn un entier naturel ett le terme de De Bruijn associé au mot⌈n⌉ et obtenu à la question 30. Calculer la longueur|t^| de la chaîne de caractères qui encodet .
◻33 - Vérifier que le codage binaire des termes de De Bruijn est une application injective.
Nous utilisons le type string avec les caractères '0' et '1' afin de représenter des codages binaires de termes de De Bruijn.
Il est possible de s'appuyer sur la fonction charlist_of_string précédemment présentée.
4.3 Interpréteur et décompresseur de De Bruijn
- Si l'arbre
b ∈ 𝒜 est de la forme V v1, avecv_1 ∈ L(G_0) , alors
- Si l'arbre
b ∈ 𝒜 est de la forme A (b1, b2), oùb_1 ∈ 𝒜 etb_2 ∈ 𝒜 sont deux arbres d'analyse, alors
- Si l'arbre
b ∈ 𝒜 est de la formeF(v1, b1) , avecv_1 ∈ L(G_0) etb_1 ∈ 𝒜 , alors
Nous supposons déjà programmée une fonction new_string : unit -> string inspirée de la section 3 qui permet, si besoin, d'engendrer une variable de
- Si l'arbre
a ∈ 𝒜 est de la forme V v , oùv ∈ L(G_0) , alors la valeur▹(a) n'est pas définie. - Si l'arbre
a ∈ 𝒜 est de la forme A (a1, a2), oùa_1 ∈ 𝒜 eta_2 ∈ 𝒜 sont deux arbres d'analyse, alors
- Si l'arbre
a ∈ 𝒜 est de la forme F (v, a1), oùv ∈ L(G_0) eta_1 ∈ 𝒜 , alors
let decompB (z : string) : string =
"string_of_int }\mp@subsup{}{|}{}(int\_of_ada\sqcup(interpret\lrcorner(ada_of_tdb\lrcorner(decodeப" ^ z ^ "))))"
Fin de l'épreuve
Questions fréquentes
4 questionsSur quels chapitres porte Informatique 2 Mines-Ponts MPI 2023 ?Afficher ou masquer la section
Questions fréquentes
4 questionsSur quels chapitres porte Informatique 2 Mines-Ponts MPI 2023 ?
Le sujet porte sur la complexité de Kolmogoroff : algorithmes dichotomiques, codage de Huffman, langages réguliers et algébriques, automates, parcours d'arbres et programmation en OCaml.
Le sujet Informatique 2 MPI 2023 des Mines sur la complexité de Kolmogoroff est-il difficile ?
Oui, le rapport indique explicitement que les correcteurs jugent le sujet difficile, tout en étant satisfaits du niveau d'un grand nombre de candidats qui ont su s'exprimer sur une bonne partie des 38 questions.
Quelles erreurs le jury a-t-il le plus relevées sur ce sujet ?
Un manque de rigueur dans la rédaction des preuves, un lemme de l'étoile mal énoncé, une notation de Landau mal utilisée et plusieurs erreurs récurrentes de programmation en OCaml.
Faut-il bien maîtriser OCaml pour ce sujet ?
Oui, le sujet comporte de nombreuses questions de programmation en OCaml, avec des attentes précises sur le style fonctionnel, la gestion des chaînes de caractères et le respect des spécifications des fonctions demandées.
Pas de description pour le moment
