ÉCOLE NATIONALE DES PONTS ET CHAUSSÉES, ÉCOLES NATIONALES SUPÉRIEURES DE L'AÉRONAUTIQUE ET DE L'ESPACE, DE TECHNIQUES AVANCÉES, DES TÉLÉCOMMUNICATIONS, DES MINES DE PARIS, DES MINES DE SAINT-ÉTIENNE, DES MINES DE NANCY, DES TÉLÉCOMMUNICATIONS DE BRETAGNE, ÉCOLE POLYTECHNIQUE (FILIÈRE TSI)
CONCOURS D'ADMISSION 2011
ÉPREUVE D'INFORMATIQUE
Filière MP
Durée de l'épreuve : heures.
L'utilisation d'une calculatrice est autorisée.
Sujet mis à disposition des concours : ENSAE ParisTech, TELECOM SudParis (ex-INT), TPE-EIVP
L'énoncé de cette épreuve comporte 8 pages.
Les candidats sont priés de mentionner de façon apparente sur la première page de la copie :
INFORMATIQUE - MP
Recommandations aux candidats
Si, au cours de l'épreuve, un candidat repère ce qui lui semble être une erreur d'énoncé, il le signale sur sa copie et poursuit sa composition en expliquant les raisons des initiatives qu'il est amené à prendre.
Tout résultat fourni dans l'énoncé peut être utilisé pour les questions ultérieures même s'il n'a pas été démontré.
Il ne faut pas hésiter à formuler les commentaires qui semblent pertinents même lorsque l'énoncé ne le demande pas explicitement.
Composition de l'épreuve
L'épreuve comporte :
un exercice sur les automates : page 2
un problème d'algorithmique et programmation : pages 2 à 8
Exercice sur les automates
On considère dans cet exercice des mots définis sur l'alphabet .
Le transposé (ou miroir) d'un mot , où les sont des éléments de , est le mot, noté , qui s'écrit . Ainsi, le transposé de est . Un mot est un palindrome s'il est identique à son transposé : . Pour un entier donné, le préfixe (respectivement, suffixe) de longueur d'un mot de longueur au moins est le sousmot formé des premiers (respectivement, derniers) symboles de . Ainsi, le préfixe de longueur 3 de est tandis que son suffixe de longueur 4 est .
Pour tout entier , on définit le langage sur l'alphabet de la manière suivante : est l'ensemble des mots de longueur supérieure ou égale à dont le suffixe de longueur est le transposé du préfixe de longueur . Ainsi, abbbbaba appartient à (car est le transposé de ) et à (car est le transposé de ) mais n'est pas dans .
1 - Donner une expression rationnelle décrivant le langage .
2 - Construire un automate non déterministe reconnaissant le langage . On impose que ait un seul état initial et un seul état final ; par ailleurs, les transitions de seront étiquetées par des éléments de .
3 - Déterminiser l'automate obtenu à la question précédente. Il n'est pas nécessaire de détailler le processus de déterminisation.
4 - En s'inspirant des questions précédentes, montrer que est un langage rationnel pour tout .
5 - Soit . On considère maintenant le langage formé de tous les mots de longueur strictement inférieure à , ainsi que des mots de longueur supérieure ou égale à dont le suffixe de longueur est le transposé du préfixe de longueur . Indiquer si est un langage rationnel et prouver la réponse.
6 - Montrer que le langage des palindromes sur l'alphabet n'est pas rationnel.
7 - Montrer que l'intersection d'une suite infinie de langages rationnels n'est pas nécessairement un langage rationnel.
Problème d'algorithmique et programmation : ordres pour un tournoi
Préliminaire concernant la programmation. Il faudra écrire des fonctions ou des procédures à l'aide d'un langage de programmation qui pourra être soit Caml, soit Pascal, tout autre langage étant exclu. Indiquer en début de problème le langage de programmation choisi; il est interdit de modifier ce choix au cours de l'épreuve. Certaines questions du problème sont formulées différemment selon le langage de programmation ; cela est indiqué chaque fois que nécessaire. Par ailleurs, pour écrire une fonction ou une procédure en langage de programmation, le candidat pourra définir des fonctions ou des procédures auxiliaires qu'il explicitera, ou faire appel à d'autres fonctions ou procédures définies dans les questions précédentes.
Dans l'énoncé du problème, un même identificateur écrit dans deux polices de caractères différentes désigne la même entité, mais du point de vue mathématique pour la police écrite en italique (par exemple : ) et du point de vue informatique pour celle écrite en romain (par exemple : T).
Dans ce problème, on note faux et vrai les deux valeurs possibles d'une variable booléenne. On considérera des matrices carrées; les colonnes et les lignes d'une matrice carrée de dimension seront toujours numérotées de 0 à . Si est une matrice carrée de dimension , pour et , représentera le coefficient de situé sur la ligne et la colonne . On appelle tournoi une matrice carrée à coefficients booléens qui, si la matrice est de dimension , vérifie
pour et avec ;
pour faux.
Si la matrice est de dimension , le tournoi est dit d'ordre . L'ordre des tournois considérés dans ce problème sera toujours au moins égal à 1 .
On représentera un tournoi par un dessin de la façon suivante : à chaque entier vérifiant , on fait correspondre un cercle contenant l'entier ; pour tout couple d'entiers et vérifiant et , si vaut vrai on trace une flèche du cercle contenant au cercle contenant ; on dira que ce dessin est un graphe qui représente . Le tournoi défini à gauche ci-dessous est représenté par le graphe qui se trouve à sa droite.
Le tournoi
Le graphe
On utilisera aussi le tournoi défini à gauche ci-dessous et représenté par le graphe qui se trouve à sa droite.
Le tournoi
Le graphe
On utilisera enfin le tournoi défini à gauche ci-dessous et représenté par le graphe qui se trouve à sa droite.
On s'intéresse à un jeu nommé qui se joue à deux joueurs ; pour chaque partie du jeu , il y a un gagnant et un perdant, il n'y a pas de match nul. Soit un entier strictement positif. On considère un ensemble de joueurs. Une compétition du jeu effectuée par les joueurs consiste à ce que chaque joueur joue une et une seule fois au jeu contre chaque autre joueur. Les joueurs sont identifiés par des numéros allant de 0 à . Le résultat de cet ensemble de parties est représenté par un tournoi d'ordre : pour et distincts vérifiant les inégalités et , le coefficient de vaut vrai si le joueur a gagné contre le joueur et faux sinon ; pour , le coefficient vaut faux. On dira que le tournoi représente le résultat de la compétition .
Par exemple, s'il y a quatre joueurs et que la compétition est représentée par le tournoi cidessus :
le joueur 0 a gagné contre le joueur 3 et perdu contre les joueurs 1 et 2 ,
le joueur 1 a gagné contre les joueurs 0 et 2 et perdu contre le joueur 3,
le joueur 2 a gagné contre le joueur 0 et perdu contre les joueurs 1 et 3 ,
le joueur 3 a gagné contre les joueurs 1 et 2 et perdu contre le joueur 0 .
On appelle classement d'ordre toute permutation des entiers . Un classement d'ordre sera noté ( ), , ). Après une compétition entre joueurs, un classement d'ordre est interprété comme un classement des joueurs par résultats décroissants; le joueur est considéré comme étant le meilleur tandis que le joueur est considéré comme étant le moins bon ; un joueur est mieux placé qu'un joueur si le joueur apparaît avant le joueur dans le classement; par exemple, pour quatre joueurs, le classement est interprété comme : 1 est meilleur que 3 qui est meilleur que 2 qui est meilleur que 0.
Après une compétition, on peut chercher à déterminer le classement qui représente le mieux le résultat de la compétition ; il y a différentes méthodes permettant de faire cela, ces méthodes ne donnent pas toutes le même classement ; on étudie deux d'entre elles dans ce problème : la méthode de Copeland et la méthode de Slater.
Indications pour Caml
Soit un entier. Un vecteur de vecteurs de longueur est appelé matrice de dimension . Un tournoi d'ordre sera codé en Caml par une matrice de dimension de booléens. Par exemple, le tournoi défini ci-dessus sera codé de la façon suivante :
let T = [|[|false; false; false; true|];
[|true; false; true; false|];
[|true; false; false; false|];
[|false; true; true; false|];|];;
Un classement d'ordre sera codé par un vecteur d'entiers de dimension . Par exemple, le classement ( ) sera codé par :
let classement = [|1; 3; 2; 0|];;
Fin des indications pour Caml
Indications pour Pascal
On définit la constante et les types ci-dessous :
const MAX = 100;
type Matrice = array[0..MAX - 1, 0..MAX - 1] of Boolean;
type Vecteur = array[0..MAX - 1] of Integer;
Un tournoi d'ordre sera codé par une variable de type Matrice. On supposera qu'on ne traite que des tournois d'ordre au plus MAX. Par exemple, le tournoi sera codé par une variable de type Matrice nommée T de la façon suivante :
false;
false;
frue;
true;
,
false;
frue;
,
false;
false;
Un classement d'ordre sera codé par une variable de type Vecteur. Par exemple, le classement ( ) sera codé par une variable de type Vecteur nommée classement de la façon suivante :
classement[0] := 1; classement[1] := 3;
classement[2] := 2; classement[3] := 0;
Fin des indications pour Pascal
Première partie : méthode de Copeland
Dans un tournoi , on appelle score de (pour ) le nombre de termes égaux à vrai sur la ligne de ; par rapport à la compétition du jeu décrite ci-dessus, le score de est le nombre de parties gagnées par le joueur . Par exemple, si la compétition est décrite par , les scores des joueurs et 3 sont respectivement égaux à et 2 .
Soit un tournoi représentant une compétition ; un classement est appelé classement de Copeland pour le tournoi si les scores des joueurs dans ce classement sont décroissants au sens large. Le classement ( ) est un classement de Copeland pour le tournoi puisque, dans l'ordre de ce classement, les scores forment la suite décroissante et 1 . - Indiquer un classement de Copeland pour le tournoi . - La fonction calculer_scores.
Caml : Écrire en Caml une fonction calculer_scores telle que, si T est une matrice de booléens codant un tournoi d'ordre n, alors calculer_scores T renvoie un vecteur d'entiers de longueur contenant, pour qui varie de 0 à , le score du joueur à l'indice .
Indiquer la complexité de cette fonction.
Pascal : Écrire en Pascal une fonction calculer_scores telle que, si T est de type Matrice et code un tournoi d'ordre , alors calculer_scores(T, n)
renvoie un tableau de type Vecteur contenant, pour qui varie de 0 à , le score du joueur dans la case d'indice .
Indiquer la complexité de cette fonction.
10 - La fonction classement_Copeland.
Caml : Écrire en Caml une fonction classement_Copeland telle que, si T est une matrice de booléens codant un tournoi d'ordre , alors classement_Copeland T renvoie un vecteur d'entiers de longueur contenant un classement de Copeland pour .
Indiquer la complexité de cette fonction.
Pascal : Écrire en Pascal une fonction classement_Copeland telle que, si T est de type Matrice et code un tournoi d'ordre , alors classement_Copeland(T, n) renvoie un tableau de type Vecteur contenant un classement de Copeland pour .
Indiquer la complexité de cette fonction.
Deuxième partie : valeur de Slater d'un classement
Soient un tournoi d'ordre représentant le résultat d'une compétition et un classement d'ordre ; on dit qu'une partie jouée entre deux joueurs et pendant la compétition est contredite par le classement si est avant dans alors que a perdu la partie contre , ou bien si est avant dans alors que a perdu la partie contre . On appelle valeur de Slater du classement pour et on note Slater le nombre de parties de contredites par . Autrement dit, est le nombre de couples vérifiant simultanément :
,
faux.
À titre d'exemple, considérons le classement ; pour calculer Slater , on peut examiner successivement les valeurs de (qui vaut faux et contribue donc pour 1 ), de (qui vaut vrai), de (qui vaut vrai), de (qui vaut vrai), de (qui vaut faux et contribue donc pour 1), de (qui vaut vrai): Slater vaut donc 2 , les parties contredites par le classement étant la partie entre 1 et 3 et la partie entre 0 et 3 . En posant , calculer Slater . - En notant le classement de Copeland pour déterminé à la question , calculer Slater . - La fonction valeur_Slater.
Caml : Écrire en Caml une fonction valeur_Slater telle que, si T est une matrice de booléens codant un tournoi d'ordre et si sigma est un vecteur codant un classement d'ordre , alors valeur_Slater T sigma renvoie Slater . Indiquer la complexité de la fonction valeur_Slater.
Pascal : Écrire en Pascal une fonction valeur_Slater telle que, si T, de type Matrice, code un tournoi d'ordre , si sigma, de type Vecteur, code un classement d'ordre , alors valeur_Slater(T, sigma, n) renvoie Slater .
Indiquer la complexité de la fonction valeur_Slater.
Troisième partie : indice de Slater d'un tournoi
On appelle indice de Slater d'un tournoi d'ordre et on note le minimum de Slater sur l'ensemble des classements d'ordre .
Un classement de Slater pour un tournoi est un classement d'ordre vérifiant . Ainsi, un classement de Slater pour contredit un minimum de parties de la compétition représentée par le tournoi . - Calculer et indiquer un classement de Slater pour .
Soit un tournoi d'ordre . Soient et deux entiers distincts compris entre 0 et ; on dit que ( ) est un arc de si vaut vrai ; cela signifie aussi que le joueur a gagné contre le joueur dans la compétition représentée par , ou bien encore qu'il y a une flèche de vers dans le graphe illustrant .
Soit ; on considère entiers distincts, , compris entre 0 et ; on dit que ( ) est un circuit de si sont des arcs de (autrement dit, a gagné contre a gagné contre a gagné contre et enfin a gagné contre ); on dira que ( ), ( ), ... ( ), ( ) sont les arcs de ce circuit. Si vaut 3 , on dit qu'il s'agit d'un triangle de . On dit que deux circuits de sont arcdisjoints s'ils n'ont pas d'arc en commun. Par exemple, dans , les circuits et ( ) sont arc-disjoints. - On suppose qu'il existe circuits deux à deux arc-disjoints dans le tournoi . Indiquer en fonction de un minorant de l'indice de Slater de . Justifier la réponse. - On considère un tournoi d'ordre , un classement d'ordre et un ensemble de circuits deux à deux arc-disjoints dans le tournoi . On suppose que l'on a . Indiquer alors ce qu'on peut dire de l'indice de Slater de et du classement . - Calculer et indiquer un classement de Slater pour ; déduire de ce résultat qu'un classement de Copeland pour un tournoi n'est pas toujours un classement de Slater pour .
On considère un ensemble de triangles deux à deux arc-disjoints d'un tournoi . On dit que cet ensemble est un ensemble maximal de triangles deux à deux arc-disjoints de si tout triangle de possède au moins un arc en commun avec au moins un triangle de . On remarquera que l'ensemble n'est pas nécessairement de cardinal maximum parmi les ensembles de triangles deux à deux arc-disjoints du tournoi . - Indiquer un ensemble maximal de triangles deux à deux arc-disjoints de . - La fonction compter_triangles.
Il s'agit de calculer le cardinal d'un ensemble maximal de triangles deux à deux arcdisjoints d'un tournoi d'ordre . Pour cela, la fonction compter_triangles construit une suite de triangles deux à deux arc-disjoints (suite dont il n'est pas nécessaire de mémoriser les éléments) jusqu'à avoir un ensemble maximal. La complexité de cette fonction devra être de l'ordre de , on ne justifiera pas cette complexité.
Caml : Écrire en Caml une fonction compter_triangles telle que, si T est une matrice de booléens codant un tournoi d'ordre , alors compter_triangles T renvoie le cardinal d'un ensemble maximal de triangles deux à deux arc-disjoints de .
Pascal : Écrire en Pascal une fonction compter_triangles telle que si T, de type Matrice, code un tournoi d'ordre , alors compter_triangles(T, n) renvoie le cardinal d'un ensemble maximal de triangles deux à deux arc-disjoints de .
Quatrième partie : méthode de Slater
On se propose d'écrire en langage de programmation une fonction qui, étant donné un tournoi d'ordre , détermine un classement de Slater pour . Pour cela, on énumère tous les classements possibles, c'est-à-dire toutes les permutations de , on calcule pour chaque classement la valeur de et on retient un classement qui donne la plus petite valeur de cette fonction.
Pour préparer l'écriture de cette fonction, on s'intéresse, pour fixé, à la liste des permutations de triées par ordre lexicographique croissant ; par exemple, pour , cette liste est . - On considère la liste des permutations des entiers triées par ordre lexicographique croissant ; indiquer les huit premières permutations qui suivent la permutation ( ). On ne justifiera pas la réponse. - La fonction permutation_suivante.
La fonction permutation_suivante reçoit en paramètre une permutation des entiers . Si cette permutation n'est pas la permutation ( , ), c'est-à-dire si ce n'est pas la dernière permutation dans le tri considéré, la fonction transforme le contenu de sigma pour que sigma contienne, après l'appel de la fonction, la permutation suivant la permutation dans l'ordre lexicographique et renvoie la valeur true; dans le cas contraire, elle renvoie la valeur false et ne transforme pas sigma.
Caml : Écrire en Caml une fonction permutation_suivante telle que, si est un entier au moins égal à 1 et si sigma est un vecteur de longueur contenant une permutation des entiers , alors permutation_suivante sigma effectue les opérations décrites ci-dessus.
Pour faciliter l'écriture de la fonction permutation_suivante, on pourra écrire auparavant une fonction qui échange deux valeurs d'un vecteur.
Pascal : Écrire en Pascal une fonction permutation_suivante telle que, si est un entier au moins égal à 1 et si sigma, de type Vecteur, contient entre les indices 0 et une permutation des entiers , alors permutation_suivante(sigma, n) effectue les opérations décrites ci-dessus. Pour faciliter l'écriture de la fonction permutation_suivante, on pourra écrire auparavant une procédure qui échange deux valeurs d'un tableau. - La fonction classement_Slater.
Caml : Écrire en Caml une fonction non récursive classement_Slater telle que, si est une matrice de booléens codant un tournoi d'ordre , alors classement_Slater T renvoie un vecteur de longueur contenant un classement de Slater pour .
Pascal : Écrire en Pascal une fonction non récursive classement_Slater telle que, si , de type Matrice, code un tournoi d'ordre , alors classement_Slater(T, n) renvoie un tableau de type Vecteur contenant un classement de Slater pour .
Mines Option Informatique MP 2011 - Version Web LaTeX | WikiPrépa | WikiPrépa