Mines Informatique Commune MP PC PSI 2026Sujet et rapport du jury
- Listes de listes en Python
- Boucles : variant et invariant
- Dénombrement et représentation binaire
- Théorie des jeux : algorithme minimax
- Élagage alpha-bêta
- Bases de données : SQL, jointures, agrégats
Téléchargements
- Corrigé : pas encore disponible
Présentation du sujet
Le jeu Quixo : programmation du jeu, algorithme minimax, élagage alpha-bêta et requêtes SQLAfficher ou masquer la section
Présentation du sujet
L'épreuve d'informatique commune MP, PC et PSI des Mines 2026 (2 heures, Python et SQL, sur cahier de réponses) porte sur le jeu Quixo à deux joueurs. Le sujet programme d'abord le jeu entre deux humains, puis construit un adversaire artificiel avec l'algorithme minimax, une fonction d'évaluation et l'élagage alpha-bêta, et se termine par des requêtes SQL sur une base de parties.
- 1Jeu à deux joueurs humains (Q1 à Q11)première annéePlateau en liste de listes, nombre de configurations et de bits nécessaires, validité des coups, glissement des pions avec variant de boucle et détection des alignements gagnants.
- 2Jeu contre un ordinateur (Q12 à Q19)seconde annéeDénombrement des coups possibles, arbre minimax, faisabilité de l'exploration, fonction d'évaluation, puis élagage alpha-bêta sur un arbre et dans un code à compléter.
- 3Gestion d'une base de données (Q20, Q21)Requêtes SQL sur les tables Partie et Joueur avec jointures et agrégats.
Ce qu'a observé le jury
6 erreurs relevéesListe de listes mal construite · Variant et invariant confondus · Alignement non consécutifAfficher ou masquer la section
Ce qu'a observé le jury
6 erreurs relevéesLe sujet de 21 questions balayait une partie conséquente du programme d'informatique des deux années. Le début reposait sur l'algorithmique de première année, la suite sur l'adaptation de minimax, algorithme de seconde année, puis sur l'alpha-bêta, inconnu de la plupart, qui a révélé la capacité de certains à s'approprier un algorithme nouveau. Le jury note une détérioration de la propreté et de la lisibilité des copies.
Les erreurs les plus sanctionnées
- 1Liste de listes mal construiteQ1
Certaines listes créées ont des lignes dépendantes les unes des autres, d'autres copies affectent plateau[i][j] alors que plateau est une liste vide.
« numpy est régulièrement utilisé alors qu'il est explicitement demandé dans le sujet de créer une liste de listes. »
- 2Variant et invariant confondusQ8
La question d'analyse attend une réponse courte et précise, pas une paraphrase du code.
« La notion d'invariant ne semble pas toujours maitrisée et est confondue avec la notion de variant. »
- 3Alignement non consécutifQ10
La sortie de boucle et la position du test du nombre de cases alignées sont souvent incorrectes, et la contrainte d'optimalité n'est pas toujours respectée.
« Plusieurs copies testent si n cases de la ligne sont contrôlées par le joueur sans tester qu'elles sont consécutives. »
- 4Boucles imbriquées inutilesQ11, Q16
À la question 16, ces boucles superflues entraînent en plus une erreur de dénombrement ; les tests if, elif et else sont aussi mal utilisés.
« Plusieurs candidats utilisent des boucles imbriquées alors qu'une boucle suffit. »
- 5Booléens et syntaxe Python approximatifs
Parenthèses oubliées dans les tests, assert à la place de if, = au lieu de ==, syntaxe numpy appliquée à des listes et fonctions qui ne renvoient rien dans certains cas.
« Les règles de Morgan ne sont pas maitrisées »
- 6Requêtes SQL mal jointesQ20, Q21
Confusions entre WHERE et HAVING, entre JOIN et UNION, mauvais usage de LIKE, et condition de jointure erronée : id de Joueur doit être égal à id_joueur1 ou id_joueur2 de Partie.
Ce qui a été bien réussi
- La question 9 est très réussie.
- La question 13 (arbre minimax) est bien traitée lorsqu'elle l'est.
Conseils du jury
- Utiliser un brouillon avant de remplir le cahier de réponses et tenir dans l'espace prévu, sans astérisques ni renvois.
- Lire attentivement les consignes, par exemple l'interdiction d'énumérer les cases du bord (Q5).
- Vérifier qu'une fonction renvoie bien une valeur dans tous les cas.
- Réserver les commentaires aux astuces et choisir des noms de variables cohérents, sans réutiliser un nom déjà pris.
- Vérifier que l'interprétation d'un résultat concorde avec l'ordre de grandeur obtenu (Q14).
- Se familiariser avec le programme officiel d'informatique commune et lire 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
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 NATIONALE DES PONTS et CHAUSSÉES, ISAE-SUPAERO, ENSTA, TÉLÉCOM PARIS, MINES PARIS - PSL, MINES SAINT-ÉTIENNE, MINES NANCY, IMT ATLANTIQUE, ENSAE PARIS, CHIMIE PARISTECH - PSL.
Durée de l'épreuve : 2 heures
L'usage de la calculatrice ou de tout dispositif électronique est interdit.
Les candidats sont priés de mentionner de façon apparente sur la première page de la copie :
Cette épreuve est commune aux candidats des filières MP, PC et PSI.
L'énoncé de cette épreuve comporte 8 pages de texte.
Le travail doit être reporté sur le cahier de réponses de 8 pages distribué avec le sujet. Un seul cahier de réponses est fourni au candidat, dont toutes les feuilles seront obligatoirement rendues à la fin de l'épreuve. Le renouvellement de ce document en cours d'épreuve est interdit.
Pour valider ce cahier réponses, chaque candidat doit obligatoirement y inscrire à l'encre, à l'intérieur du rectangle d'anonymat situé en haut de chaque copie, sa date de naissance, son nom, son prénom, son numéro d'inscription et sa signature.
Jeu Quixo à deux joueurs.
1 Présentation
- -le joueur choisit l'un de ses cubes ou un cube neutre; le cube choisi est obligatoirement situé sur les bords du plateau (cases blanches sur la figure 1(a)),
- -le cube est ensuite replacé, en le passant à la marque du joueur s'il était neutre, pour pousser les autres cubes jusqu'à boucher la case libérée précédemment (figure 1(b)). Il est interdit de remettre le cube à sa place d'origine.

2 Jeu à deux joueurs humains
□ Q1 - Écrire une fonction initialisation() -> [[int]] qui initialise le plateau de jeu 5 × 5 avec uniquement des cases neutres.
□ Q2 - Sans tenir compte d'éventuelles symétries ou de configurations inaccessibles, déterminer une borne supérieure du nombre de configurations possibles du plateau de jeu. À l'aide d'un logarithme, en déduire une expression du nombre de bits nécessaires pour représenter ces configurations par des entiers.
□ Q3 - Donner les couples d'indices (ligne, colonne) valides ordonnés par indice de ligne croissant correspondant aux pions que peut choisir le joueur 1.
□ Q4 - Le joueur 1 choisit le pion de coordonnées (1,4). Donner les cases où il peut repositionner son pion pour finir son tour de

□ Q5 - Écrire une fonction case_bord(i:int, j:int) -> bool qui prend en arguments les coordonnées
□ Q6 - Écrire une fonction
case_choix_valide(jeu:[[int]], iːint, j:int, joueur:int) -> bool qui prend en arguments le plateau de jeu, les coordonnées
□ Q7 - Écrire une fonction
case_deplacement_valide(i_d:int, j_d:int, i_n:int, j_n:int) -> bool qui prend en arguments les coordonnées de départ
□ Q8 - Déterminer quel est le mouvement global des pièces pour les quatre cas définis dans la fonction au niveau des commentaires "mouvement 1", "mouvement 2", "mouvement 3 " et "mouvement 4 ". Répondre dans la zone blanche à côté du commentaire. Montrer que la procédure se termine en n'étudiant que le cas du mouvement 1. On précisera le variant de boucle retenu.
□ Q9 - Compléter les lignes vides de la procédure précédente (mouvement 2).
- -alig(jeu:[[int]], joueur:int, i:int, n:int) -> bool qui renvoie True si un alignement de
n pions du joueur passé en argument est trouvé sur la lignei et False sinon; - -acol(jeu:[[int]], joueur:int, j:int, n:int) -> bool qui renvoie True si un alignement de
n pions du joueur passé en argument est trouvé sur la colonnej et False sinon; - -adiag1(jeu: [[int]], joueur:int, n:int) -> bool qui renvoie True si un alignement de
n pions du joueur passé en argument est trouvé sur la diagonale partant de(0, 0) et False sinon; - -adiag2(jeu: [[int]], joueur:int, n:int) -> bool qui renvoie True si un alignement de
n pions du joueur passé en argument est trouvé sur la diagonale partant de(0, 4) et False sinon.
alig(jeu:[[int]], joueur:int, i:int, n:int) -> bool telle que décrite précédemment. On veillera à n'accéder qu'une seule fois à la valeur de chaque case dans un souci d'optimalité.
□ Q11 - Écrire une fonction gagnant (jeu: [[int]], joueur:int) -> bool qui prend en arguments le plateau de jeu à la fin d'un tour et un joueur, qui renvoie True si le joueur possède au moins un alignement gagnant et False sinon. Cette fonction utilisera les fonctions précédemment définies.
3 Jeu contre un ordinateur
□ Q12 - Dans le cas du plateau en situation initiale, déterminer le nombre exact de mouvements possibles pour le joueur 1.
Déterminer sans justification une situation de jeu où le nombre de mouvements possibles est minimal et donner ce nombre.
Considérons l'arbre de jeu donné en exemple sur le cahier réponse. Les carrés correspondent aux tours du joueur MAX et les ronds à ceux du joueur MIN. L'arbre proposé indique 16 configurations atteignables en 4 tours depuis une configuration contrôlée par le joueur MAX. Les valeurs indiquées dans les cases correspondent au score obtenu pour chaque configuration.
□ Q13 - Compléter l'arbre en appliquant la stratégie "minimax".
□ Q14 - Discuter de la faisabilité de l'utilisation de cet algorithme dans le cadre de ce jeu en basant votre réponse sur le calcul du nombre de mouvements possibles dans le pire des cas sur 3 tours de jeu en partant de la situation initiale.
deplacements_possibles(jeu:[[int]], joueur:int) -> [[int]],

Heuristique d'évaluation
L'idéal serait de chercher tous les chemins gagnants mais le nombre de possibilités et le nombre de tours pour les atteindre sont tellement grands que l'arbre est impossible à explorer en totalité. On va se contenter de prévoir quelques tours d'avance et de choisir le meilleur chemin. On ne construit donc l'arbre du jeu que sur quelques niveaux de profondeur.
Le meilleur chemin est défini grâce à une fonction d'évaluation qui renvoie une valeur associée à l'état du plateau de jeu. Si la valeur absolue est très grande et la valeur est positive, alors le joueur 1 est susceptible de gagner. Si la valeur absolue est très grande et la valeur est négative, c'est le joueur 2 qui risque de gagner.
- -si le plateau est gagnant alors on renvoie 100 + profondeur pour le joueur 1 et -100 - profondeur pour le joueur 2. La valeur 100 est conventionnelle. Elle est choisie uniquement pour favoriser les branches gagnantes.
- -sinon, on construit une valeur en fonction du joueur considéré :
- -en ajoutant 5 fois le nombre d'alignements de 4 pions du joueur;
- -en ajoutant 20 si la case centrale appartient au joueur;
- -en ajoutant le nombre de pions du joueur et en soustrayant le nombre de pions de son adversaire ;
- -en ajoutant la profondeur ;
- -la fonction renvoie la valeur si le joueur considéré est le joueur 1 et l'opposé de cette valeur sinon.
□ Q17 - Écrire une fonction : evaluation(jeu:[[int]], joueur:int, profondeur:int) -> int qui prend en arguments le plateau de jeu, le joueur et la profondeur de la recherche et qui renvoie le résultat de l'évaluation d'une position du jeu.
Élagage "alphabeta"

Supposons que le premier enfant de V donne une valeur de 4 (inférieure à 5), cela ne sert à rien de poursuivre l'évaluation des autres branches de V car si les valeurs sont plus grandes que 4, le joueur MIN choisira la plus petite valeur (donc 4) et comme cette valeur est inférieure à 5, ce sera la valeur 5 qui remontera au niveau de U.
Si le premier enfant de V a une valeur de 4, alors la valeur de V sera au moins 4.
La valeur de V sera donc supérieure à 3, il ne sert à rien de poursuivre l'évaluation des autres enfants de V (car le joueur MIN prendra la valeur la plus petite donc 3).
□ Q18 - En reprenant l'exemple de la question 13, compléter les noeuds qu'il faut déterminer et représenter les coupures des branches non calculées, comme sur la figure 4, en supposant que la construction se fait toujours en commençant par les nœuds situés à gauche.
alphabeta(noeud, alpha, beta, profondeur)
si noeud est une feuille ou profondeur atteinte alors
renvoyer la valeur de l'heuristique du noeud
profondeur = profondeur - 1
si noeud de type Max alors
v = -infini
pour tout fils de noeud faire
v = max(v, alphabeta(fils, alpha, beta, profondeur))
si v >= beta alors #coupure beta
renvoyer v
alpha = max(alpha, v)
sinon
v = infini
pour tout fils de noeud faire
v = min(v, alphabeta(fils, alpha, beta, profondeur))
si alpha >= v alors #coupure alpha
renvoyer v
beta = min(beta, v)
renvoyer v
def alphabeta(jeu:[[int]], joueur:int, alpha:float, \
beta: float, profondeur:int) -> tuple:
if ..................................... : #à compléter
.......................................
return eval, None
profondeur = profondeur - 1
meilleur_depl = None
if joueur == 1: #noeud Max
v = -math.inf
for depl in deplacements_possibles(jeu, joueur):
jeu_c = copy.deepcopy(jeu)
deplacement_case(...................................)
v = max(v, alphabeta(......................................)[0])
if v >= beta:
return v, meilleur_depl
if v > alpha:
alpha = v
meilleur_depl = depl
else: #noeud Min
v = math.inf
for depl in deplacements_possibles(jeu, joueur):
jeu_c = copy.deepcopy(jeu)
deplacement_case(.........NON DEMANDE................)
v = min(v, alphabeta(............NON DEMANDE................)[0])
if alpha >= v:
return v, depl
if v < beta:
beta = v
meilleur_depl = depl
return v, meilleur_depl
4 Gestion d'une base de données
- -Partie avec les attributs :
- -id l'identifiant d'une partie, clé primaire, de type entier ;
- -id_joueur1 l'identifiant du joueur 1, clé étrangère, de type entier ;
- -id_joueur2 l'identifiant du joueur 2, clé étrangère, de type entier ;
- -id_gagnant l'identifiant du gagnant, clé étrangère, de type entier ;
- -date la date de la partie, de type chaîne de caractères ;
- -nbtours le nombre de tours de la partie, de type entier.
- -Joueur avec les attributs :
- -id l'identifiant du joueur, clé primaire, de type entier ;
- -nom le nom du joueur, de type chaîne de caractères ;
- -prenom le prénom du joueur, de type chaîne de caractères.
□ Q21 - Écrire une requête SQL qui renvoie le nombre de tours de la partie ayant nécessité le moins de tours, ainsi que les noms et prénoms des joueurs 1 et 2 ayant participé à cette partie. On supposera l'unicité de cette partie.
Questions fréquentes
4 questionsSur quoi porte le sujet d'informatique commune Mines 2026 (MP, PC, PSI) ?Afficher ou masquer la section
Questions fréquentes
4 questionsSur quoi porte le sujet d'informatique commune Mines 2026 (MP, PC, PSI) ?
Sur le jeu Quixo : programmation du jeu en Python, recherche d'une stratégie par l'algorithme minimax et l'élagage alpha-bêta, puis deux requêtes SQL sur une base de parties.
Quelles erreurs le jury a-t-il relevées en informatique commune Mines 2026 ?
Usage de numpy au lieu d'une liste de listes, confusion entre variant et invariant, alignements testés sans vérifier qu'ils sont consécutifs, boucles imbriquées inutiles, erreurs de syntaxe Python et jointures SQL erronées.
Faut-il connaître l'alpha-bêta pour l'info commune Mines 2026 ?
Non. Selon le jury, cet algorithme était inconnu de la majorité des candidats ; l'énoncé l'expliquait et fournissait son pseudo-code. L'algorithme minimax, lui, est au programme de seconde année.
Le sujet d'info commune Mines 2026 est-il faisable en première année ?
En partie : le jury indique que le début du sujet fait appel à l'algorithmique de première année, tandis que la partie sur minimax relève de la seconde année.
Pas de description pour le moment
