CCINP Informatique Commune TSI 2023Sujet et rapport du jury
- Manipulation de listes et slicing
- Dictionnaires
- Copie superficielle et copie profonde
- Algorithme de Dijkstra
- Requêtes SQL
Téléchargements
- Corrigé : pas encore disponible
Présentation du sujet
Difficulté moyenneTests d'erreurs informatiques en entreprise : numéro de sécurité sociale, carte bancaire, QR code, plus court chemin et SQLAfficher ou masquer la section
Présentation du sujet
Difficulté moyenneLe sujet porte sur la programmation de méthodes de test d'erreurs pour une entreprise : validation d'un numéro de sécurité sociale, d'un numéro de carte de crédit avec la formule de Luhn, d'un QR code, recherche du plus court chemin par l'algorithme de Dijkstra sur un graphe de magasins, puis requêtes SQL. Il comporte 22 questions réparties en cinq parties de difficulté progressive.
- 1Partie I : test du code de sécurité socialeVérification de la validité d'un numéro de sécurité sociale par manipulation de listes et de chaînes.
- 2Partie II : test de numéro de carte de créditApplication de la formule de Luhn à l'aide de dictionnaires.
- 3Partie III : test de QR codeManipulation de listes de listes pour valider la structure d'un QR code.
- 4Partie IV : gestion réseauRecherche du plus court chemin entre magasins avec l'algorithme de Dijkstra, entièrement expliqué dans l'énoncé.
- 5Partie V : requêtes SQLInterrogation d'une base de données de l'entreprise en SQL.
Difficulté moyenne. Le rapport indique un sujet de longueur et de difficulté adaptées, avec une difficulté progressive dans chaque partie et une troisième partie nettement plus sélective, seuls les très bons candidats l'ayant bien traitée.
L'épreuve en chiffres
Moyenne 10,26 / 20 · écart-type 4,88 · 1 137 présents · où vous situez-vous ?Afficher ou masquer la section
L'épreuve en chiffres
- Moyenne
- 10,26/ 20
- Écart-type
- 4,88
- Présents
- 1 137
- Coefficient
- 4
- Durée
- 3 h
Votre note sur 20 à ce sujet, en conditions de concours.
Source : document officiel du concours, épreuve du 26 avril 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
5 erreurs relevéesQuestion d'ouverture pourtant facile · Syntaxe des dictionnaires mal maîtrisée · Confusion sur la copie de listesAfficher ou masquer la section
Ce qu'a observé le jury
5 erreurs relevéesLe jury note une progression régulière des candidats sur les techniques de programmation Python, la structure du code et les indentations étant bien respectées. Des erreurs subsistent néanmoins sur les listes, le slicing, les dictionnaires et la syntaxe SQL. La partie sur l'algorithme de Dijkstra, hors programme de TSI mais entièrement expliquée dans l'énoncé, a été difficilement traitée.
Les erreurs les plus sanctionnées
- 1Question d'ouverture pourtant facileQ1
Malgré un principe totalement décrit dans l'énoncé, tous les candidats n'ont pas réussi cette première question.
« Tous les candidats n'ont pas réussi à répondre à cette question particulièrement facile »
- 2Syntaxe des dictionnaires mal maîtriséeQ7
L'accès à une valeur d'un dictionnaire, pourtant bien défini dans le nouveau programme, reste mal maîtrisé.
« Beaucoup trop de candidats ne connaissent pas la syntaxe des dictionnaires »
- 3Confusion sur la copie de listesQ10
De nombreux candidats ne distinguent pas copie de référence, copie profonde et copie superficielle sur des listes de listes.
« un grand nombre de candidats qui n'ont pas compris ce qu'est la copie de référence »
- 4Appropriation rapide de l'algorithme de DijkstraQ18
Bien que l'énoncé fournisse tous les éléments nécessaires, les candidats ont eu du mal à s'approprier l'algorithme en quelques minutes.
« les candidats ont eu des difficultés à s'approprier l'algorithme de Dijkstra en quelques minutes »
- 5Syntaxe SQL fautiveQ21, Q22
Les deux dernières questions de requêtes SQL ont révélé de gros problèmes de syntaxe.
« Gros problèmes de syntaxe »
Ce qui a été bien réussi
- La question 2 sur le code de sécurité sociale a été en général bien réussie.
- La question 19 sur la gestion réseau a été généralement très bien traitée.
Conseils du jury
- Bien maîtriser le slicing des listes, y compris avec des indices négatifs.
- Distinguer clairement copie superficielle et copie profonde sur des listes de listes.
- Commenter le code et soigner le style de programmation, ces éléments sont évalués.
- Écrire une copie lisible avec des noms de variables explicites.
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
ÉPREUVE SPÉCIFIQUE - FILIÈRE TSI
INFORMATIQUE
Durée : 3 heures
RAPPEL DES CONSIGNES
- Utiliser uniquement un stylo noir ou bleu foncé non effaçable pour la rédaction de votre composition ; d'autres couleurs, excepté le vert, peuvent être utilisées, mais exclusivement pour les schémas et la mise en évidence des résultats.
- Ne pas utiliser de correcteur.
- Écrire le mot FIN à la fin de votre composition.
Les calculatrices sont interdites.
Important : vous pouvez utiliser les fonctions des questions précédentes, même si vous ne les avez pas toutes implémentées.
- le texte du sujet : 10 pages;
- les Annexes : 3 pages;
- le Document Réponse (DR) : 8 pages.
Seul le Document Réponse est à rendre dans son intégralité.
Gestion de Tests dans une entreprise
Partie I-Tests de code de sécurité sociale
- Sexe (1
^(er) chiffre); - Année de naissance (les deux chiffres suivants);
- Mois de naissance (les deux chiffres suivants);
- Lieu de naissance (les cinq chiffres ou caractères suivants - 2 chiffres
^2 du code du département de naissance, suivis de 3 chiffres du code commune officiel de l'Insee^3 ); - Numéro d'ordre permettant de distinguer les personnes nées au même lieu à la même période (les 3 chiffres suivants).
Les deux derniers chiffres, compris entre 01 et 97 , permettent de déterminer la clé, appelée aussi "clé de contrôle", qui permettra de contrôler l'exactitude du numéro de sécurité sociale.
- Un QR code (Quick Response code) désigne un type de code-barres en deux dimensions, lequel se compose de modules noirs disposés dans un carré à fond blanc (voir figure 1).
- Pour simplifier le problème, nous supposons que les deux départements corses 2 A et 2 B sont représentés par le code 20 comme avant 1976.
- Institut national de la statistique et des études économiques.
>>> num_secu("2 91 01 75 018 002")
2910175018002
>>>clef(2910175018002)
Q3. Écrire la fonction num_secu_complet qui détermine le numéro complet de sécurité sociale. Cette fonction a un paramètre de type int et retourne un élément de type int.
Exemple :
>>>num_secu_complet(2910175018002)
291017501800268
>>>test_num_secu('2 91 01 75 018 002 68')
True
>>>test_num_secu('2 91 01 75 018 002 93')
False
Partie II - Test de numéro de carte de crédit
Q5. Écrire une fonction num_en_liste qui transforme un nombre entier en une liste de chiffres. Cette fonction a un paramètre de type int et retourne un élément de type list.
num_en_liste(4532015112830465)
[4, 5, 3, 2, 0, 1, 5, 1, 1, 2, 8, 3, 0, 4, 6, 5]
Exemple :
tuple_pairs_impairs(4532015112830465)
([6, 0, 8, 1, 5, 0, 3, 4], [5, 4, 3, 2, 1, 1, 2, 5])
>>> cree_dico(4532015112830465)
{'pair': [6, 0, 8, 1, 5, 0, 3, 4], 'impair': [5, 4, 3, 2, 1, 1, 2, 5]}
Remarque : la partie correspondant à la clé 'impair' n'est pas modifiée par le traitement de cette fonction.
>>> un_dico=cree_dico(4532015112830465)
>>> traitement_nb_pairs(un_dico)
{'pair': [3, 0, 7, 2, 1, 0, 6, 8], 'impair': [5, 4, 3, 2, 1, 1, 2, 5]}
test_num_carte_credit(4532015112830465)
True
Partie III - Tests de QR code

Exemple :
>>> init(4)
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
P1
1 from Gestion_QRCode import *
2
3 img=open("./Image/ccinp.png")..........# Lecture de l'image
4 img.show().....................................# Affichage de l'image (figure 1)
5 largeur,hauteur=img.size..................# La taille de l'image (largeur, hauteur)
6 position = (largeur,hauteur) .............# Résultat : (420, 420)
Indication : utiliser la fonction getpixel du module Python Gestion_QRCode (voir sa définition dans l'annexe 1).
On prend comme bloc de positionnement celui représenté dans la figure 3.

Exemple :
>>> cree_bloc()
[[0, 0, 0, 0, 0, 0, 0],
[0, 1, 1, 1, 1, 1, 0],
[0, 1, 0, 0, 0, 1, 0],
[0, 1, 0, 0, 0, 1, 0],
[0, 1, 0, 0, 0, 1, 0],
[0, 1, 1, 1, 1, 1, 0],
[0, 0, 0, 0, 0, 0, 0]]
Remarque : on cherche à tester si un bloc de positionnement d'un QR code n'a pas subi une modification. Les coordonnées du pixel le plus haut et à gauche pour le premier bloc sont égales à
test_bloc( 0,0 , mat1)
Truetest_bloc(1,3, mat1)
False
Q14. On considère qu'un QR code est bien positionné lorsque ses 3 blocs de contrôle sont effectivement présents en haut à gauche, en haut à droite et en bas à gauche (comme sur la figure 1). Écrire une fonction test_QRcode qui permet de tester si un QR code est bien positionné. Cette fonction a pour paramètre une matrice de dimension 21 *21 et retourne un booléen.
test_QRcode(mat1)
True

Écrire une procédure
Exemple :
>>> tourHoraire(0,1, mat1)

| a | i | c | d |
| e | f | g | b |
| o | j | k | l |
| m | n | h | p |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Par exemple, dans la figure 4 cette fonction réalisera la première rotation de
Partie IV - Gestion réseau

Principe de l'algorithme de Dijkstra
Entrée :
$G(S, A)$ : un graphe pondéré,
$d$ : le sommet de départ à partir duquel on veut déterminer les plus courts chemins aux
autres sommets,
$P$ : construction d'un sous-graphe tel que la distance entre un sommet de $P$ depuis $d$ soit
définie et soit un minimum dans le graphe $G$,
Parent : tableau pour noter les sommets par où on passe. Parent est utilisé comme le tableau
des précédents de chaque sommet, initialisé avec un élément n'appartenant pas à $S$,
$M$ : tableau où les indices représentent les sommets du graphe : 0 désigne le sommet
" $A$ ", 1 désigne le sommet " $B$ ", 2 désigne le sommet " $C$ ", etc...
Les éléments de ce tableau sont corrigés au fur et à mesure de l'algorithme afin
d'obtenir les distances les plus courtes du sommet de départ à un sommet du graphe.
Début:
$\mathrm{P} \leftarrow \emptyset$
$\mathrm{M}[\mathrm{d}] \leftarrow 0 \quad / /$ la distance de $d$ à lui-même est égale à 0
$\mathrm{M}[\mathrm{s}] \leftarrow+\infty$ pour chacun des sommets du graphe autre que $d$
Tant qu'il existe un sommet qui ne soit pas dans $P$
Choisir un sommet $s$ hors de $P$ de plus petite distance $M[s]$
Ajouter $s$ à $P$
Pour chaque sommet $u$ hors de $P$ mais voisin de $s$
si M[u] > M[s] + poids(s,u)
$\mathrm{M}[\mathrm{u}]=\mathrm{M}[\mathrm{s}]+$ poids $(\mathrm{s}, \mathrm{u})$
Parent $[u]=s \quad / /$ le sommet $s$ est le prédécesseur du sommet $u$
Fin du pour
Fin tant que
Fin
Q18. Compléter les 3 lignes manquantes du tableau
Q19. Donner la valeur du plus court chemin entre "A" et "F". Expliquer comment on obtient cette valeur à l'aide du tableau
Partie V - Requêtes SQL
La table "clients" est constituée de 5 champs :
- id : de type INTEGER - clé primaire auto-incrémentée ;
- num_secu : de type INTEGER - entier de 15 chiffres ;
- nom : de type TEXT;
- prenom : de type TEXT;
- num_CB : de type INTEGER.
- id : de type INTEGER - clé primaire auto-incrémentée ;
- ref_produit : de type INTEGER ;
- nom_produit : de type TEXT;
- qrcode : de type TEXT;
- prix : de type DECIMAL.
- date : de type TEXT ;
- ref_produit : de type INTEGER ; - clé étrangère, pointe vers la clé primaire id de la table produits;
- num_client : de type INTEGER; - clé étrangère, pointe vers la clé primaire id de la table clients.
Q20. Écrire, en SQL, la requête (1) qui permet d'obtenir le numéro de carte de crédit de toutes les personnes référencées dans la base de données de l'entreprise dont le numéro de sécurité sociale commence par 2. On utilisera le caractère "_" comme le séparateur des milliers. Par exemple 10000000 sera réécrit comme 10_000_000.
Annexe 1
Module "Gestion_QRCode"
fonction Gestion_QRCode.open(fp)
- Paramètre :
- fp : nom de fichier (chaîne de caractères) représentant une image sous différents formats tels que PPM, PNG, JPEG, GIF, TIFF et BMP.
- Retour :
- retourne une variable qui est un descripteur d'image (un objet image).
img=Gestion_QRCode.open("uneImage.png")
fonction Gestion_QRCode.Show()
- Retour :
- retourne la valeur None.
^6
Exemple:
attribut Gestion_QRCode.size
Exemple :
print(img.size)
(360, 160) # soit largeur = 360 pixels et hauteur = 160 pixels
fonction Gestion_QRCode.getpixel(x,y)
- Paramètres :
- x : la coordonnée x du pixel référencé ;
- y : la coordonnée y du pixel référencé.
- Retour:
- retourne les attributs de la couleur du pixel, au format RVB
^7
(r,v,b) = img.getpixel(100,30)
6. La valeur None est une valeur qui correspond à l'absence de valeur.
7. Le système RVB (Rouge, Vert, Bleu), ou en anglais RGB (Red, Green, Blue), permet de coder les couleurs en informatique. Un écran informatique est composé de pixels représentant une couleur au format RVB. La composante R est codée sur 8 bits de 0 à 255 en décimal. Il en va de même pour les composantes suivantes. Le codage des couleurs va du plus foncé au plus clair.
Annexe 2
Base de données "Gestion_Entreprise"
| id | num_secu | nom | prenom | num_CB |
| 1 | 286128817863441 | Eldyn | Sophie | 6767342589219928 |
| 2 | 298082934500890 | Gomez | Maria | 2324563490665454 |
| 3 | 298082934500896 | Ruiza | Flor | 9889454573204522 |
| 4 | 109086723487917 | Kovitz | Boris | 6789543778653678 |
| 5 | 175105642102321 | Mottreff | Erwan | 4745342178563217 |
| 6 | 189027511732543 | Settin | Michel | 7856432167453492 |
| 7 | 191017511318196 | Valérie | Georges | 8787564521392354 |
|
|
|
|
|
|
| id | ref_produit | nom_produit | qrcode | prix |
| 1 | 27 | Buffet chêne |
|
320 |
| 2 | 102 | Chaise rustique |
|
65 |
| 3 | 453 | Table ronde |
|
75 |
| 4 | 756 | Table ovale |
|
120 |
| 5 | 921 | Coffret Bali |
|
170 |
|
|
|
|
|
|
| date | ref_produit | num_client |
| 2020-05-15 | 2 | 2 |
| 2020-06-17 | 3 | 1 |
| 2020-06-21 | 3 | 7 |
| 2020-07-19 | 4 | 5 |
| 2020-08-19 | 5 | 5 |
| 2020-09-05 | 4 | 6 |
|
|
|
|
Annexe 3
Rappels des syntaxes en Python
| Définir une liste. |
|
||
| Définir une liste de listes. |
|
||
| Ajouter un élément à la fin d'une liste. | L.append(5) LL.append([9, 10]) | ||
| Convertir un nombre entier en une chaîne de caractères. | >>> str(12345) '12345' | ||
|
>>> int('12345') 12345 | ||
|
|
>>> 10//3 3 | ||
|
|
>>> 10%3 1 | ||
| Définir une chaîne de caractères. | mot='Python' | ||
| Longueur d'une chaîne. | len(mot) | ||
| Le slicing permet d'extraire des éléments d'une liste ou d'une chaîne. |
|
FIN

DOCUMENT RÉPONSE
| | | ||||||||||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | - | - | . | - | - | | | - | - | - | | | - | - | - | - | - | | | | | - | - | | | | | | | | | ||||||
| - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | | | |||||||||||||||
| - | - | - | - | 0.1 | - | - | |||||||||||||||||||||||||||||
| - | - | ||||||||||||||||||||||||||||||||||
| - | - | - | - | - 0.000 | ![]() |
- | - | - | |||||||||||||||||||||||||||
| - | - 0.0 .00 | - | - | - | - | ![]() |
|||||||||||||||||||||||||||||
![]() |
- | - | - | ||||||||||||||||||||||||||||||||
| - | - | - | 0.00 .0 | ||||||||||||||||||||||||||||||||
| - | 0.00000 | - | - | - | |||||||||||||||||||||||||||||||
| - | - | - | |||||||||||||||||||||||||||||||||
| - | - | - | - | - | - | ||||||||||||||||||||||||||||||
| | 0.00 | 1 | ||||||||||||||||||||||||||||||||||
| - | ![]() |
- | - | - | - | - | - | - | - |
|
- | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | |||
| - | - | | | lo | | | | | - | | | - | | | | | | | | | | | | | | | | | - | T | - | - | - | - | - | - | | | | | | | | | |||||||
| - | - | - | - | | | - | - | |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | - | - | - | ![]() |
- | - | - | - | - | - | 都鎄 |
|
- | - | - | - | 都讍 | - | - | - |
|
- | - | - | |||||
| - | - | - | - | - | - | - | - |
|
|||||||||||||||||||||||||||
| - | |||||||||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | - | - | - | lo | - | - | - | - | | | - | - | - | | | - | - | - | . | - | - | - | - | | | |
|
||||||
| - | - | - | - | - | - | - | - | - | - | - | - | - | - | ||||||||||||||||||||||
| - | |||||||||||||||||||||||||||||||||||
![]() |
|||||||||||||||||||||||||||||||||||
![]() |
|||||||||||||||||||||||||||||||||||
![]() |
|||||||||||||||||||||||||||||||||||
![]() |
|||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||
| 0.00000 | |||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

.jpg)


| A | B | C | D | E | F | |
| étape initiale | 0 |
|
|
|
|
|
|
|
- | 2 |
|
(1) |
|
|
|
|
- | (2) |
|
- | 3 |
|
|
|
- | - | 5 | - | (3) | 7 |
|
|
||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
1 | - |
|
1 | - | - | 1 | 1 | 1 | . | - | - | - |
|
1 | 1 | - | - | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
|
|
|||||||||||||||||||||||||||||||||
- L'algorithme de Luhn, ou code de Luhn, ou encore formule de Luhn est aussi connu comme l'algorithme "modulo 10".
- Une procédure est une fonction qui retourne la valeur None mais cette valeur n'est pas destinée à être utilisée ou à être capturée.
Questions fréquentes
4 questionsSur quels chapitres porte l'épreuve d'informatique commune CCINP TSI 2023 ?Afficher ou masquer la section
Questions fréquentes
4 questionsSur quels chapitres porte l'épreuve d'informatique commune CCINP TSI 2023 ?
Le sujet couvre la manipulation de listes et de chaînes, les dictionnaires, le parcours de graphe avec l'algorithme de Dijkstra et les requêtes SQL, en mobilisant surtout le programme de première année et quelques notions de seconde année.
Quelles erreurs le jury a-t-il le plus relevées ?
Le jury cite la manipulation des listes et du slicing, les confusions entre types int et str, la valeur retournée par une fonction, et la copie superficielle ou profonde de listes de listes.
L'algorithme de Dijkstra est-il au programme de la filière TSI ?
Non, il est hors programme de TSI, mais l'énoncé présentait tous les points nécessaires à sa compréhension.
Ce sujet est-il faisable avec le seul programme de première année ?
Le sujet fait très largement appel aux connaissances de première année, tout en intégrant de nouvelles notions du programme de seconde année comme les dictionnaires et les graphes.
Pas de description pour le moment

.jpg)

.jpg)
.jpg)
.jpg)
.jpg)
.jpg)
.jpg)

