X ENS Informatique Commune MP PC PSI 2019Sujet, corrigé et rapport du jury
Tetris couleurs
- Algorithmique : boucles for et while, complexité
- Structures de données : tableaux et grilles
- Récursivité
- Bases de données : requêtes SQL
- Programmation en Python
Téléchargements
Présentation du sujet
DifficileProgrammation d'un jeu de type Tetris Couleurs : grille, mouvements, score, variante récursive et requêtes SQLAfficher ou masquer la section
Présentation du sujet
DifficileLe sujet, commun aux filières MP, PC et PSI, propose de programmer en Python un jeu de puzzle inspiré de Tetris, où des barreaux de blocs colorés descendent dans une grille. Il comporte cinq parties : le lancement du jeu (initialisation et affichage de la grille), les mouvements des barreaux, le calcul du score et l'élimination des alignements, une variante fondée sur des régions unicolores traitée par un algorithme récursif, et enfin la gestion d'une base de données de parties et de joueurs en SQL.
- 1Partie I : lancement du jeuCréation d'une grille vide et affichage de la grille à l'écran.
- 2Partie II : mouvements des barreauxDétection de place disponible, descente simple, déplacement latéral, permutation des blocs et descente rapide d'un barreau.
- 3Partie III : score et alignementsCalcul du score, détection des alignements de blocs de même couleur et tassement de la grille après élimination.
- 4Partie IV : variante du jeuÉcriture d'un algorithme récursif pour calculer une région unicolore maximale et analyse de son fonctionnement.
- 5Partie V : gestion de la base de donnéesÉcriture de requêtes SQL sur une base de données des parties jouées et des joueurs.
Difficile. Pour les candidats français de la filière PC, la note moyenne n'est que de 7,49/20 avec un écart-type de 3,08, et plusieurs questions (notamment Q14 et Q15 sur la partie récursive) affichent des taux de réussite complète inférieurs à 2%.
L'épreuve en chiffres
Moyenne 7,49 / 20 · écart-type 3,08 · 463 copies · où vous situez-vous ?Afficher ou masquer la section
L'épreuve en chiffres
- Moyenne
- 7,49/ 20
- Écart-type
- 3,08
- Copies
- 463
Votre note sur 20 à ce sujet, en conditions de concours.
Source : rapport du jury. 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 sur la syntaxe des boucles while · Confusion entre break et return · Recopie inutile et coûteuse de la grilleAfficher ou masquer la section
Ce qu'a observé le jury
6 erreurs relevéesPour les candidats français de la filière PC (463 candidats), la note moyenne s'établit à 7,49/20 avec un écart-type de 3,08. Le jury relève une incompréhension inquiétante de l'utilisation des boucles, une confusion fréquente entre plusieurs opérations Python de base, et une incompréhension profonde du calcul de complexité d'un algorithme, pourtant considérée comme une connaissance de base.
Les erreurs les plus sanctionnées
- 1Confusion sur la syntaxe des boucles while
Pour écrire une condition combinée avec and, certaines copies proposent une syntaxe incorrecte du type while A if B, qui ne fonctionne pas du tout de la même manière.
« pour écrire while A and B, certaines copies proposent while A if B, ce qui ne fonctionne pas du tout de la même manière »
- 2Confusion entre break et return
Les correcteurs relèvent une confusion fréquente entre ces deux opérations, qui n'ont pourtant pas le même effet sur l'exécution du programme.
« beaucoup de confusion entre les opérations break et return. »
- 3Recopie inutile et coûteuse de la grilleQ1 à Q7
Plusieurs copies recopient systématiquement la grille donnée en argument, ce qui démontre une incompréhension du fonctionnement et de la complexité d'un programme.
« C'est une opération coûteuse et inutile qui démontre une incompréhension majeure du fonctionnement d'un programme »
- 4Calcul de complexité mal maîtrisé
Plusieurs copies expriment la complexité en fonction d'un paramètre 'n' jamais explicité, alors que le problème s'exprimait en fonction de la longueur et de la largeur de la grille.
« Plusieurs copies ont exprimé la complexité en fonction d'un paramètre 'n' jamais explicité »
- 5Cas dx=0 et dy=0 non excluQ10
Il fallait exclure ce cas particulier sous peine d'obtenir une boucle infinie, une subtilité presque jamais prise en compte par les candidats.
« Cette subtilité n'a presque jamais été prise en compte par les candidats. »
- 6Comparaison de grilles au lieu de scoresQ13
Pour la condition d'arrêt, il ne fallait surtout pas comparer les grilles entre elles, ce qui est de complexité élevée, mais simplement comparer les scores.
Ce qui a été bien réussi
- La question 1, sur la création d'une grille vide, a été résolue avec la totalité des points par 80% des candidats malgré sa simplicité apparente.
- La question 3, sur la détection de place disponible pour un barreau, a été globalement bien traitée.
- La majorité des candidats a montré une bonne intuition de l'algorithme attendu pour le calcul du score (Q9), même si la mise en œuvre fut laborieuse.
Conseils du jury
- Bien maîtriser la syntaxe et la différence de fonctionnement entre les boucles for et while.
- Éviter de recopier inutilement des structures de données, ce qui alourdit la complexité du programme.
- Exprimer une complexité algorithmique en fonction des paramètres réellement donnés dans l'énoncé.
- Respecter précisément les consignes de l'énoncé, notamment la distinction entre fonction et procédure.
- Vérifier systématiquement les cas particuliers et les bornes des boucles pour éviter les boucles infinies ou les erreurs de limite.
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
ECOLES NORMALES SUPERIEURES
FILIERES MP, PC et PSI - Epreuve
INFORMATIQUE B
(XELCR)
L'utilisation des calculatrices n'est pas autorisée pour cette épreuve
Le langage de programmation sera obligatoirement Python.
Tetris Couleurs
- déplacer le barreau vers la gauche ou vers la droite,
- permuter l'ordre des blocs dans le barreau,
- faire descendre le barreau «rapidement ».
- [ ] crée une liste vide (c'est-à-dire ne contenant aucun élément).
- len (liste) renvoie la longueur de la liste liste.
- liste. append (x) ajoute l'élément x à la fin de la liste liste.
- liste [i] renvoie le (i + 1)-ième élément de la liste liste s'il existe ou produit une erreur sinon (noter que le premier élément de la liste est liste [0]).
Important : L'utilisation de toute autre fonction sur les listes telle que liste.insert (i,x), liste.remove(x), liste.index(x), ou encore liste.sort(x) est rigoureusement interdite. Ces fonctions devront être réécrites explicitement si nécessaire.
Nous attacherons la plus grande importance à la lisibilité du code produit par les candidats; aussi, nous encourageons les candidats à utiliser des commentaires et à introduire des procédures ou des fonctions intermédiaires pour faciliter la compréhension du code.
Partie I. Initialisation et affichage de l'aire de jeu
- VIDE pour une case vide;
-
R, V, B, N, J pour les couleurs.
grille = [ [J, R, R, N, V, R, VIDE, VIDE, VIDE, VIDE, VIDE, VIDE],
[R, R, B, J, VIDE, R, N, V, VIDE, VIDE, VIDE, VIDE],
[J, N, N, R, VIDE, J, VIDE, VIDE, VIDE, VIDE, VIDE, VIDE],
[J, J, VIDE,R, VIDE, VIDE, VIDE, VIDE, VIDE, VIDE, VIDE, VIDE],
[N, VIDE,R, VIDE, VIDE, R, VIDE, VIDE, VIDE, VIDE, VIDE, VIDE],
[VIDE, V, VIDE, VIDE, VIDE, VIDE, VIDE, VIDE, VIDE, VIDE, VIDE, VIDE]]
Question 1. Écrire une fonction creerGrille (largeur, hauteur) qui renvoie une grille de dimensions largeur

.jpg)
- afficheCouleur(c) qui prend en argument une constante de couleur
c ∈ {R, V, B, N, J} et affiche le caractère correspondant ; - afficheBlanc() qui affiche un espace vide;
- nouvelleLigne() qui déplace le curseur au début de la ligne suivante.
Question 2. Écrire une procédure afficheGrille(grille) qui affiche à l'écran
V
N
RRJ R
V
NJRR
RBN R
RRNJ V
JRJJN
Partie II. Création et mouvement du barreau
Question 3. Écrire une fonction grilleLibre (grille, k) qui renvoie True si dans au moins une colonne de la grille, les

les
Question 4. Écrire une procédure descente (grille,

Question 5. Écrire une procédure deplacerBarreau(grille,

Question 6. Écrire une procédure permuterBarreau (grille,

Question 7. Écrire une procédure descenteRapide (grille,

Partie III. Détection des alignements et calcul du score
| V | |||||
| N | |||||
| R | R | J | R | ||
| V | B | B | B | B | |
| N | J | R | R | B | |
| R | B | N | V | R | B |
| R | R | N | J | V | V |
| J | R | J | J | N | V |
.jpg)


Question 9. Écrire une fonction detecteAlignement (rangee) qui prend en argument un tableau rangee non vide à une dimension contenant des valeurs dans l'ensemble
- marking est un tableau de la même taille que rangee contenant des Booléens, tel que marking [i] = True si et seulement si rangee [i] appartient à un alignement unicolore de longueur au moins 3 .
- score est le nombre de points obtenus par le joueur pour les alignements présents dans rangee (selon le barème donné plus haut).
- marking = [False, True, True, True, True, True, True, True, False, False, False]
- score
= 3 .
Question 10. Écrire une fonction scoreRangee (grille,
Question 11. Écrire une fonction effaceAlignement (grille) qui prend en argument une grille et renvoie un tuple (
- g est la grille mise à jour où tous les blocs appartenant à un alignement unicolore sont remplacés par des cases vides.
- score est le nombre total de points obtenus par le joueur pour les alignements présents dans la grille.
Question 12. Écrire une procédure tassementGrille(grille) qui modifie la grille donnée en argument en effectuant le tassement de ses cases non vides.
Question 13. Écrire une fonction calculScore (grille) qui met à jour la grille grille après élimination des alignements et tassement, répétés jusqu'à ce que la grille ne contienne plus aucun alignement unicolore de longueur

Partie IV. Variante du jeu : régions unicolores
Question 14. Écrire une fonction récursive tailleRegionUnicolore (grille, x, y) qui renvoie le nombre de cases appartenant à la plus grande région unicolore de la grille contenant la case (
Question 15. Déterminer si la fonction exploreRegion (grille,
Si non, donner un exemple de paramètres grille,
def xDansGrille(grille, x):
largeur = len(grille)
return (x >= 0) and (x < largeur)
= grille[x][y]
couleur =
v = y + dir
while yDansGrille(grille, v):
if grille[x][v] != couleur:
return V - dir
def yDansGrille(grille, y):
hauteur = len(grille[0])
return (y >= 0) and (y < hauteur)
v = v + dir
if dir == 1:
return hauteur - 1
else:
return 0
def exploreRegion(grille, x, y):
inf = exploreVertical(grille, x, y, -1) # explore vers le bas
sup = exploreVertical(grille, x, y, 1) # explore vers le haut
d = exploreHorizontal(grille, x, y, 1) # explore vers la droite
g = exploreHorizontal(grille, x, y, -1) # explore vers la gauche
score = sup - inf + 1 + d + g
return score
def exploreHorizontal(grille, x, y, dir):
largeur = len(grille)
couleur = grille[x][y]
inf = exploreVertical(grille, x, y, -1) # explore vers le bas
sup = exploreVertical(grille, x, y, 1) # explore vers le haut
score = 0
u = x + dir
while xDansGrille(grille, u) and (inf <= sup):
v = inf
infNew = 1 # initialement, infNew > supNew
supNew = 0
while (v <= sup):
if grille[u-dir][v] == couleur and grille[u][v] == couleur:
infNew = exploreVertical(grille, u, v, -1) # explore vers le bas
supNew = exploreVertical(grille, u, v, 1) # explore vers le haut
score = score + supNew - infNew + 1
v = supNew + 2
while (v <= sup):
if grille[u-dir][v] == couleur and grille[u][v] == couleur:
supNew = exploreVertical(grille, u, v, 1) # explore vers le haut
score = score + supNew - v + 1
v = supNew + 1
v = v + 1
v= v + 1
inf = infNew
sup = supNew
u = u + dir
return score
Partie V. Gestion des scores en SQL
- id_j, de type entier, est la clé primaire de la table JOUEURS,
- nom est une chaîne de caractères donnant le nom du joueur,
- pays est une chaîne de caractères donnant le pays du joueur,
- id_p, de type entier, est la clé primaire de la table PARTIES,
- date est la date (AAAAMMJJ) de la partie,
- duree, de type entier, est la durée en secondes de la partie,
- score, de type entier, est le nombre de points marqués au cours de la partie,
- id_joueur est un entier qui identifie le joueur de la partie.
Question 17. Étant donné un entier
Question 18. Écrire une requête SQL qui renvoie le record de France de Tetris couleur, c'est-à-dire le meilleur score réalisé par un joueur dont le pays est la France.
Question 19. Étant donné une chaîne de caractères cc contenant le nom d'un joueur (ayant déjà joué au moins une partie de Tetris couleur), écrire une requête SQL qui renvoie le rang du joueur cc, c'est-à-dire sa position dans le classement des joueurs par ordre de leur meilleur score dans une partie de Tetris couleur (on traitera les ex aequo de la même manière qu'à la question 17).

Questions fréquentes
4 questionsSur quels chapitres porte l'épreuve d'informatique commune X-ENS MP-PC-PSI 2019 ?Afficher ou masquer la section
Questions fréquentes
4 questionsSur quels chapitres porte l'épreuve d'informatique commune X-ENS MP-PC-PSI 2019 ?
Le sujet porte sur la programmation d'un jeu de type Tetris en Python : manipulation de grilles, algorithmique et complexité, récursivité pour une variante du jeu, et requêtes SQL pour la gestion d'une base de données de parties.
Quelles erreurs le jury a-t-il le plus relevées sur cette épreuve d'informatique X-ENS 2019 ?
Le jury relève une incompréhension des boucles while et for, une confusion entre les opérations break et return, une recopie inutile et coûteuse des structures de données, et une maîtrise insuffisante du calcul de complexité algorithmique.
Cette épreuve d'informatique commune X-ENS 2019 est-elle difficile ?
Pour les candidats français de la filière PC, la moyenne n'est que de 7,49/20, et certaines questions de la partie récursive n'ont été totalement réussies que par 1 à 2% des candidats.
La partie SQL du sujet X-ENS informatique commune 2019 est-elle bien réussie ?
Les résultats sont contrastés : la requête la plus simple (Q16) est réussie par environ la moitié des candidats, mais la question la plus complexe sur le classement d'un joueur (Q19) n'est réussie que par 10% d'entre eux.
Pas de description pour le moment
