CCP Tsi 2019 Informatique Sujet
CCP Tsi 2019 Informatique Sujet
CCP Tsi 2019 Informatique Sujet
ÉPREUVE SPÉCIFIQUE - FILIÈRE TSI
____________________
INFORMATIQUE
Jeudi 2 mai : 14 h - 17 h
____________________
1/12
A
Remarques générales
Important : nous informons les candidats que chaque partie de ce sujet peut être traitée sépa-
rement. Vous pouvez utiliser toutes les fonctions des questions précédentes même si vous ne les
avez pas implémentées.
Les réponses aux questions sont à rédiger sur le Document Réponse (DR) et ne doivent pas dé-
passer les dimensions des cadres proposés.
Si la réponse attendue est spécifique à un langage de programmation, seul le langage Python est
permis.
Les structures algorithmiques doivent être clairement identifiables par des indentations visibles
ou par des barres droites entre le début et la fin de la structure comme l’exemple ci-dessous :
si (Condition)
alors
| Instructions
sinon
| Instructions
fin si
Dans les questions où l’on demandera d’écrire une fonction, on donnera systématiquement sa
signature, c’est-à-dire le nom de la fonction avec les types des paramètres ainsi que le type du
résultat retourné par cette fonction.
Par exemple, la fonction foo qui prend en entrée deux paramètres de type entier et retourne une
liste, aura comme description :
2/12
SÉCURISATION DE L’ENTRÉE DU PERSONNEL D’UNE ENTREPRISE
Partie I - Présentation
Une entreprise possède 5 sites de production. Le Directeur Général veut améliorer la sécurité. Il
souhaite attribuer à chaque employé une carte personnelle et infalsifiable lui permettant l’accès
à son site de production et peut-être à d’autres sites de l’entreprise. Chaque employé est affecté
uniquement à un site que l’on appellera son site d’origine.
Chaque site de production ne pourra compter plus de 100 employés. La carte attribuée à l’em-
ployé comportera sa photo d’identité ainsi qu’une puce. Le code représentant le nom de la per-
sonne sera intégré dans la photo mais pas dans la puce.
Un tel code a été placé dans la photo de droite de la figure 1. Comme on peut le remarquer, il y a
très peu de différences entre les deux photos, l’une sans code, l’autre avec un code intégré.
Chaque employé sera référencé par un code composé d’un entier compris entre 1 et 5 (indiquant
le site de référence où il travaille) ainsi qu’une séquence de 7 caractères (pris parmi les 7 pre-
miers caractères de l’alphabet en majuscules : ’A’ . . . ’G’). Le site sera codé en machine sur 3 bits.
Par exemple, pour un employé travaillant dans le site no 3, le code pourrait être 3DABGEFC. Ce
code n’affiche pas le nom de l’employé mais un automate permet, à partir des 7 caractères, de le
retrouver.
Q1. Donner le nombre maximal d’employés par site ainsi que le nombre maximal de sites que
pourrait gérer cette entreprise avec ce type de codage. La réponse peut être donnée par une ex-
pression numérique sans chercher à la calculer.
Indiquer si la technique de codage est suffisante pour gérer le personnel de cette entreprise.
La problématique est de savoir si les codes créés pour gérer les employés sont suffisamment dis-
joints les uns des autres, c’est-à-dire si la mesure de la différence entre deux codes est suffisam-
ment importante. Ceci est possible grâce à la distance de Levenshtein qui peut être utilisée pour
analyser tous les codes. L’entreprise veut tester tous les codes associés aux employés et changer
les codes de tous ceux dont la distance de Levenshtein est inférieure à la valeur 3.
Dans cette partie, nous allons développer les fonctions permettant de répondre à cette problé-
matique.
3/12
La distance de Levenshtein est une valeur donnant une mesure de la différence entre deux chaînes
de caractères. Elle est égale au nombre minimal de caractères qu’il faut supprimer, insérer ou
remplacer pour passer d’une chaîne A à une chaîne B.
On considère que chaque opération élémentaire mise en oeuvre (supprimer, insérer ou rem-
placer) a un coût de 1. On précise que chaque opération élémentaire ne porte que sur un seul
caractère. La distance de Levenshtein, au sens mathématiques du terme, est la somme de ces
coûts.
Par exemple, la distance de Levenshtein entre les chaînes Soveil et Soleil est de coût égal à 1
car il a fallu réaliser une seule transformation, une substitution pour remplacer ’v’ par ’l’ dans la
chaîne Soveil.
On va s’intéresser à déterminer quelle est la distance de Levenshtein entre les chaînes de carac-
tères Auttame et Automne.
Q2. Écrire, dans le langage Python, les transformations (insertion, substitution, suppression)
appliquées à la chaîne Auttame afin d’obtenir la chaîne Automne. On déterminera systématique-
ment la valeur de la chaîne, notée s, avant et après chaque transformation ainsi que le nom de
la transformation appliquée.
Vous devez compléter le Document Réponse, à l’aide de s=Auttame.
Calculer le coût de la distance de Levenshtein.
L’algorithme qui vous est proposé ci-après décrit le calcul de la distance de Levenshtein entre
deux chaînes de caractères. Cet algorithme retourne un entier (éventuellement nul) donnant la
distance entre deux chaînes de caractères au sens de Levenshtein.
1 levenshtein(chaine1, chaine2) =
2 entree :
3 chaine1[], chaine de caracteres d'indice 1 a n avec n egal a longueurChaine1 ;
4 chaine2[], chaine de caracteres d'indice 1 a m avec m egal a longueurChaine2 ;
5 sortie :
6 entier : la valeur de la distance ;
7 declarer :
8 d [] : matrice de nombres entiers initialisée avec des 0, indice de 0 a n et de 0 a m ;
9 i , j , coutSubstitution : entier ;
10 debut :
11 pour i de 0 a n
12 d[ i ,0] := i
13 pour j de 0 a m
14 d[0, j ] := j
15 pour i de 1 a n
16 pour j de 1 a m
17 si (chaine1[i ] = chaine2[j ])
18 alors
19 coutSubstitution := 0
20 sinon
21 coutSubstitution := 1
22 fin si
23 d[ i , j ] := minimum(
24 d[ i −1,j ] + 1, # pour une suppression
25 d[ i , j −1] + 1, # pour une insertion
26 d[ i −1,j−1] + coutSubstitution ) # pour une substitution
27 retourner d[n, m]
28 fin
4/12
Q3. Déterminer la matrice d de l’algorithme de Levenshtein après l’instruction de la ligne 14 et
après celle de la ligne 26, ainsi que la distance de Levenshtein lors de son exécution entre les
chaînes ’GAZ’ et ’LA’.
Tous les codes ont été rassemblés dans une liste nommée table_code.
Q5. Écrire une fonction code_bon_lvs qui supprime tous les codes de la liste table_code dont la
mesure de Levenshtein est inférieure ou égale à la valeur 3. Les codes à supprimer seront rem-
placés dans la liste table_code par le code nul, c’est-à-dire la chaîne de caractères ’0000000’.
Q6. Écrire une fonction pourcentage_lvs qui détermine le pourcentage de codes nuls dans la
liste table_code. Le résultat sera une chaîne de caractères constituée d’un nombre entier (pas
un nombre flottant) et du caractère %. On permet l’arrondi d’un calcul à l’entier inférieur ou à
l’entier supérieur.
Nous allons nous intéresser à la gestion des données qui sont stockées dans la base de données
nommée Personnel et sera constituée de deux tables intitulées Employes et ListeCategories. Les
contenus de ces tables se trouvent en Annexe, page 12.
5/12
La table ListeCategories est constituée de 2 champs :
– id : de type INTEGER – clé primaire ;
– categorie : de type TEXT – liste des métiers de l’entreprise.
Des lecteurs de codes sont installés aux portes des différents sites afin de limiter les accès aux
seules personnes habilitées à y entrer.
Rappelons que le code est défini sous la forme d’une chaîne de 8 caractères, le premier caractère
indiquant le numéro du site auquel appartient une personne. Par défaut, chaque personne est
attribuée à un et un seul site, son site d’origine. Par contre, il est possible à toute personne de
cette entreprise de se déplacer dans d’autres sites si l’autorisation en a été donnée (champ site
de la table Employes). Le reste des caractères correspond à la clé de sécurité associée à chaque
employé.
La gestion du champ site est particulière. On définit un entier qui permet de connaître les sites
où l’employé est autorisé à entrer. On attribue les valeurs suivantes :
Ainsi, si un employé appartenant au site 1 est autorisé à entrer dans les sites 2 et 3, la valeur du
champ site aura comme valeur 2 + 4, soit 6. Pour un autre employé appartenant au site 4 autorisé
à entrer dans les sites 1, 2 et 5, la valeur du champ site sera 1 + 2 + 16, soit 19.
Attention : comme on peut le remarquer sur les deux exemples précédents, le numéro du site
d’origine (le site où l’employé travaille par défaut) n’est jamais pris en compte dans le calcul don-
nant la valeur du champ site.
Q7. Écrire une fonction liste_site donnant la liste des sites où un employé peut se rendre en plus
de son site d’origine dès que l’on donne une valeur (un entier) représentant la valeur du champ
site de la table Employes. Si la valeur donnée est incorrecte, la fonction liste_site retournera une
chaîne vide.
L’ordre des sites dans le résultat n’a pas d’importance.
Exemple :
>>> liste_site(21)
[1, 3, 5]
>>> liste_site(50)
[]
L’équipe de direction souhaite avoir certaines informations au sujet des employés de l’entreprise.
6/12
Q9. Écrire en SQL la requête 2 donnant comme résultat l’adresse email (sans le nom de domaine)
des employés pouvant accéder uniquement aux sites 3 et 4 en plus de leur site d’origine.
Q10. Écrire en SQL la requête 3 donnant comme résultat le nom et la catégorie des personnes de
l’entreprise ayant au moins 20 ans. Les noms seront classés par ordre alphabétique.
Q11. Écrire en SQL la requête 4 donnant comme résultat la liste des âges des employés avec
comme information associée le nombre d’employés ayant le même âge. On demande que cette
liste soit décrémentale par rapport au nombre de personnes ayant le même âge.
Par exemple, dans la table Employes, il y a 2 personnes qui ont 22 ans.
La photo, une image couleur, est décrite informatiquement comme un tableau (une matrice) de
pixels. Chaque pixel sera représenté par une couleur au format RGB 1 .
Par exemple, la couleur d’un pixel pourrait être en format RGB (64,78,191). Si on écrit les trois
composantes RGB en code binaire, on aura le triplet (01000000, 01001110, 10111111). Le bit de
poids faible de chacune des composantes RGB est représenté en gras. On va se servir de ce triplet
de valeurs définies en gras pour coder une information dans l’image.
La modification du bit de poids faible a très peu de conséquences sur la représentation de l’image.
Q13. Donner pour le codage RGB le nombre de couleurs possibles. La réponse peut être donnée
par une expression numérique sans chercher à la calculer.
1.
Le système RGB (Red, Green, Blue) ou en français (Rouge, Vert, Bleu), permet de coder les couleurs en
informatique. Un écran informatique est composé de pixels représentant une couleur au format RGB.
La composante R est codée sur 8 bits de 0 à 255 en décimal et de 00 à FF en hexadécimal. Il en va de
même pour les autres composantes. Le codage des couleurs va du plus foncé au plus clair.
Par exemple, la couleur d’un pixel orange pourrait avoir comme valeur (255,100,100). Un pixel sera de
couleur gris si les composantes R, G et B sont identiques.
7/12
Partie V - Codage de l’information
Cette partie sera consacrée à l’implémentation de fonctions qui serviront notamment dans la
partie VI, réservée au décodage de l’information se trouvant dans la photo de l’employé(e).
Les informations constituant le code sont définies dans une trame composée de blocs non consé-
cutifs. Chaque bloc sera associé à un pixel. Un premier bloc est constitué d’un pixel pour repré-
senter le numéro du site et est suivi d’une séquence de 7 blocs représentant chacun un caractère.
Le premier bloc sera considéré comme le bloc de référence.
Pour un pixel codant le numéro du site de l’employé, les bits de poids faible indiquent directe-
ment le numéro au format binaire. Ainsi, pour l’exemple précédent, le codage correspondant au
site no 3 sera (01000000, 01001111 , 10111111) puisque le triplet 011 correspond à la valeur 3 en
code décimal. Par conséquent, on met une information dans l’image en modifiant uniquement
les bits de poids faible, ce qui a peu de conséquences sur la représentation de cette image.
Pour un pixel codant une des lettres de l’identifiant de l’employé, on valide la convention sui-
vante : le caractère ’A’ sera associé à 001, le caractère ’B’ à 010, jusqu’au caractère ’G’ qui aura
comme valeur 111.
Par exemple, un pixel codant le caractère ’B’ (010) pourrait avoir pour format RGB (. . . 0, . . . 1, . . . 0).
On ne traitera pas le caractère associé à 000 qui aura pour lettre ’W’, réservée pour la gestion du
personnel de service (gardiens, personnel de nettoyage, etc.) ayant l’autorisation d’entrer dans
les sites de l’entreprise.
Chaque trame sera constituée de 8 blocs, c’est-à-dire 8 pixels (voir la figure 2).
– Un pixel de référence est défini par ses coordonnées que l’on nomme posi dans la suite.
– Le paramètre ou la variable posi est un couple de valeurs (colonne,ligne) qui est obtenu à
l’aide d’une clé se trouvant dans la puce. Les valeurs des coordonnées nommées posi sont
supposées données.
– Les caractères définis dans le code sont, dans l’image, décalés d’une valeur delta qui est
déterminée à partir du pixel de référence en calculant la somme des valeurs de ses com-
posantes R,G,B. Autrement dit, si le pixel de référence est à la position (x,y) et si la valeur
x+delta n’est pas supérieure à la largeur (imx) de l’image, le premier bloc sera à la position
(x+delta,y), sinon le bloc se trouvera sur la ligne suivante et ceci jusqu’au 7e caractère défini
dans le code de l’employé.
Figure 2 – Trame
Q14. Écrire une fonction bin2() qui, à partir d’un nombre entier, retourne un nombre en code
binaire. Cette fonction convertit un nombre entier en une chaîne de chiffres binaires sans le 0b
devant, comme le ferait la fonction bin() de Python. Le résultat sera toujours écrit sous la forme
d’une séquence d’au moins 3 digits de type string.
8/12
Remarque : pour l’implémentation de cette fonction, l’utilisation de la fonction bin() est possible.
On rappelle que la fonction bin() convertit et retourne la chaîne de caractères en format binaire
d’un entier donné. Par exemple, bin(12) retourne comme valeur la chaîne de caractères ’0b1100’.
Exemples :
>>> bin2(45)
’101101’
>>> bin2(1)
’001’
Q15. Écrire la fonction num() qui calcule à partir d’une chaîne en chiffres binaires, par exemple
’010’, sa valeur en décimal.
Si la chaîne est vide, la fonction retournera comme valeur −1.
Exemples :
>>> num(’101’)
5
>>> num(’’)
-1
9/12
Lorsque l’employé passe sa carte sur le lecteur pour ouvrir une porte, les données de la puce et le
code se trouvant dans la photo sont lus par le lecteur qui génère 2 valeurs envoyées au processus
d’analyse (dont vous allez implémenter certaines fonctions). Ces 2 valeurs sont le pixel de réfé-
rence (avec sa valeur posi) et le code associé à l’employé (un entier suivi de 7 caractères). Le pixel
de référence est différent pour chacun des employés.
Les caractères du code dans l’image ne sont pas placés d’une manière consécutive mais sépa-
rés les uns des autres par une même valeur (delta) calculée à l’aide des valeurs RGB du pixel de
référence (voir la figure 2) en réalisant la somme des 3 composantes R, G et B.
Q16. Écrire la fonction lettre() qui, à partir d’une chaîne de 3 bits, détermine le caractère. La
codification des 7 caractères a été réalisée sur seulement 3 bits. On rappelle que le caractère ’A’
est codé ’001’, le caractère ’B’ est codé ’010’ et ainsi de suite jusqu’au caractère ’G’ qui est codé
’111’, ceci en suivant l’ordre des 7 premières lettres de l’alphabet.
Exemples :
>>> lettre(’001’)
’A’
>>> lettre(’101’)
’E’
Q17. Écrire la fonction bpf qui récupère les valeurs des bits de poids faible d’un pixel.
Cette fonction a 2 paramètres, l’image et la position du pixel. Elle retourne une chaîne de carac-
tères composée de 3 bits.
Exemple :
>>> bpf(im,posi)
’011’
1 def valeur_delta(im,posi ):
2 px = im. getpixel (posi)
3 inter = (px[0] + px[1] + px[2]) % (128−41) + 40
4 if inter % 2 == 1 :
5 return inter + 1
6 else :
7 return inter
Cette fonction a 2 paramètres : l’image et les coordonnées du point de référence (le pixel du point
de référence).
10/12
Signature de la fonction valeur_delta :
valeur_delta(BmpImageFile, (int,int)) > int
Indiquer ce que fait cette fonction en précisant les valeurs retournées. Le résultat sera décrit sous
la forme d’un intervalle ou d’une union d’intervalles de nombres entiers.
Q19. Écrire la fonction lecture_lettres() qui retourne la séquence des lettres codées dans l’image,
c’est-à-dire les 7 lettres constituant une partie du code de l’employé.
Cette fonction a 2 paramètres, l’image et la position du pixel de référence. Elle retourne une
chaîne de caractères.
11/12
Annexe
Le contenu des tables Employes et ListeCategories de la base de données Personnel est donnée
ci-après.
Table “Employes”
Table “ListeCategories”
I M P R I M E R I E N A T I O N A L E – 19 1162 – D’après documents fournis
id categorie
1 ingénieur
2 secrétaire
3 comptable
4 technicien
5 opérateur
6 administratif
7 chef de projet
8 responsable de département
FIN
12/12
Numéro
d’inscription
Nom : ____________________________________
Numéro
de table
Prénom : _________________________________
Né(e) le
Épreuve de : Informatique
QR Code
TSIIN07
DOCUMENT RÉPONSE
SÉCURISATION D’UNE ENTREPRISE
Q1
Réponse justifiée : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.......................................................................................
B
1/ 11
/
1/11
NE RIEN ÉCRIRE DANS CE CADRE
Q2
1) Première séquence
Nom de la transformation : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Code Python :
2) Deuxième séquence
Nom de la transformation : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Code Python :
···/···
2/ 11
2/11/
Q2 suite
3) Troisième séquence
Nom de la transformation : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Code Python :
Q3
Distance de Levenshtein =
3/ 11
3/11/
Q4
Complexité : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Q5
Q6
4/ 11
4/11
Numéro
d’inscription
Nom : ____________________________________
Numéro
de table
Prénom : _________________________________
Né(e) le
Épreuve de : Informatique
QR Code
TSIIN07
Q7
5/ 11 C
/
5/11
NE RIEN ÉCRIRE DANS CE CADRE
Q8
Requête 1 =
Q9
Requête 2 =
Q10
Requête 3 =
6/ 11
6/11/
Q11
Requête 4 =
Q12
Pixel bleu : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Pixel blanc : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Q13
.......................................................................................
7/ 11
7/11/
Q14
Q15
8/ 11
8/11
Numéro
d’inscription
Nom : ____________________________________
Numéro
de table
Prénom : _________________________________
Né(e) le
Épreuve de : Informatique
QR Code
TSIIN07
Q16
Q17
9/ 11
/
9/11
NE RIEN ÉCRIRE DANS CE CADRE
Q18
Explication : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.......................................................................................
.......................................................................................
.......................................................................................
.......................................................................................
.......................................................................................
Résultat : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Q19
10/ 11
/
10/11
Q20
Réponse : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.......................................................................................
FIN
11/ 11
/
11/11