Vous êtes sur la page 1sur 8

Mardi 8 Mars 2022

Durée : 3h

INFORMATIQUE
CONCOURS BLANC

Si, au cours de l’épreuve, vous repérez ce qui vous semble être une erreur d’énoncé, d’une part vous
le signalez au surveillant, d’autre part vous le signalez sur votre copie et vous poursuivez la composition
en indiquant les raisons des initiatives que vous avez été amené à prendre.

L’usage de calculatrice est autorisé

AVERTISSEMENT

• Composer sur copies doubles grand carreaux uniquement.


• A la fin de chaque exercice on change de page (ou de copie) obligatoirement.
• La présentation, la lisibilité, l’orthographe, la qualité de la rédaction, la clarté et la précision
des raisonnements entreront pour une part importante dans l’appréciation des copies.
• En particulier, les résultats non encadrés et non-justifiés ne seront pas pris en compte.

Tournez la page S.V.P.


Lycée de l’Essouriau ÉPREUVE D’INFORMATIQUE Les Ulis

PROBLÈME
Implémentation dans « 1984 » de George Orwell
???????????

CONSIGNES ET CONSEILS
I Les parties de ce problème sont totalement indépendantes entre elles. Il existe des questions très abordables
dans chaque partie donc lisez le sujet en entier quitte à passer des questions.
I Au sein d’une même partie, Vous avez le droit d’utiliser toute fonction mentionnée dans une des questions
précédentes, même si vous n’avez pas réussi à l’écrire.
I À moins de les redéfinir explicitement, l’utilisation de toute autre fonction que celles explicitement au pro-
gramme de CPGE est interdite. (sort, index, max, min, reverse, ... sont donc proscrites.)
I On rappelle enfin qu’une fonction qui s’arrête sans avoir rencontré l’instruction return renvoie None.

???????????

PROLOGUE
Dans un univers inspiré du roman 1984 de George Orwell, la Police de la Pensée utilise l’ordinateur Big
Brother pour surveiller les citoyens et citoyennes du pays. Ses fonctionnaires souhaitent intervenir rapidement
si une menace sérieuse se profile (par exemple en cas de manifestation, de critique de Big Brother ou de propos
subversifs).
Chaque habitant du pays ne peut échapper au regard omniprésent du télécran, sorte d’écran installé dans
chaque foyer qui sert à la diffusion continue de la propagande du gouvernement et à voir et entendre ce qui se
passe chez les gens. (l’expression « Big Brother is watching you. » provient de ce livre)
Vous êtes Winston Smith, 39 ans, habitant de Londres en Océania et employé du Parti extérieur (donc
membre du régime autoritaire d’Océania) et vous officiez au ministère de la Vérité. Votre rôle est de programmer
des fonctionnalités supplémentaires en Python sur l’ordinateur Big Brother pour le rendre plus efficace.
(En espérant vous avoir donné envie de lire le roman original dont je modifie assez librement le contenu.)

I FICHAGE ET NOTATION DES INDIVIDUS


En Océania, la police de la pensée a fiché tous les individus du pays. Chaque habitant possède donc un
matricule (ou numéro d’identification) qui est un entier naturel n. Ce dernier est converti en binaire et stocké
sur 32 bits dans Big Brother, ce qui permet à ce dernier de stocker et d’accéder plus facilement aux données
personnelles de chaque personne.
1. La population d’Océania est de 56 millions d’individus. Y a-t-il assez de numéros de matricule pour toute la
population avec 32 bits ? Et si on entreprend de ficher la population mondiale ? (4,6 millards d’habitants)
2. A quel numéro correspond le code binaire sur 32 bits : 0000 0000 0001 0010 1101 0110 1000 0111 ?
3. Winston Smith a pour numéro de matricule 1984. Quel est son numéro de matricule écrit sur 32 bits.
Si un grand nombre de 0 apparait (x zéros par exemple), il sera possible de noter : |0 .{z
. . 0}.
x zéros

4. Écrire une fonction Binaire(n) qui prend en entrée un entier naturel n écrit en base 10 et renvoie la
valeur de n écrit en base 2 sous forme d’une chaine de caractères "a_p...a_0".
On rappelle que la commande str() transforme un nombre (flottant ou entier) en chaı̂ne de caractères.

Fabien DÉLEN fdelen.maths@bbox.fr 2 PCSI 2021-2022


Lycée de l’Essouriau ÉPREUVE D’INFORMATIQUE Les Ulis

5. En déduire une fonction Code32bits(n) qui renvoie sous forme de chaı̂ne de caractères le code binaire
sur 32 bits (complété avec assez de 0) d’un entier n.
Dans ce monde autoritaire, à partir de 16 ans (âge de la majorité en Océania) la Police de la Pensée
commence à noter l’individu devenu majeur. La note attribué initialement est de 0, chaque action au service du
Parti extérieur rapporte des points et chaque action subversive en fait perdre. La note de chaque individu est
donc à chaque instant un entier relatif qui varie .
Dans cette fin de partie, la représentation des nombres sera celle du complément à 2 (c’est-à-dire celle vue
en cours) et les nombres seront codés sur 8 bits.
6. On dit qu’un citoyen est un citoyen modèle lorsque sa note dépasse 100 points. Il accède alors à des
privilèges. Quelle est la représentation en mémoire du nombre 100 ?
7. Un citoyen est considéré comme très dangereux lorsque sa note passe en-dessous de −100.
Quelle est la représentation en mémoire du nombre −100 ?
8. Comment savoir si la note d’un individu est négative en regardant sa représentation sur 8 bits sans calcul ?
9. Quelles sont les notes extrémales possibles ? Justifier.

II DÉCOMPTE DU TEMPS DE VIE


D’après les cadres dirigeants, passé un certain âge les individus deviennent une charge pour la société. Ils
sont alors éliminés et leur corps est recyclé pour fabriquer du Soylent Green, produit qui nourrit une grande
partie de la population. Ce produit est fabriqué par Soylent Industries, une entreprise qui se présente au grand
public qui ignore tout comme un fabricant d’aliments de synthèse à partir du plancton océanique ou de germes
de soja. (Cette idée provient plutôt du film « Soleil Vert » sorti en 1973.)
Dès la naissance d’un individu, on déclenche une horloge interne associée au matricule qui mesure le temps
qui s’écoule par pas de 1/10 s. Pour obtenir le temps en secondes, le système multiplie ce nombre par 10 en
utilisant un registre de 16 bits.
On rappelle les règles suivantes pour un nombre flottant codé sur 16 bits, ces nombres sont d’abord écrits
sous une forme binaire normalisée :
±(1, mantisse) × 2exposant
puis codés de la manière suivante :
 1 bit positionné en tête de code représente le signe (0 pour un nombre positif, 1 pour un nombre négatif)
 l’exposant e est codé sur 5 bits et est représenté en base 2 par l’entier n = e + 15 ;
 la mantisse est codée sur 10 bits
10. L’écriture binaire exacte de 0, 1 est 0, 000 1100 1100 1100 . . . (périodique ensuite). Donner son écriture
normalisée ainsi que son code sur 16 bits.
11. Expliquer pourquoi l’erreur d’arrondi commise par l’horloge interne est de 2, 4 × 10−5 s.
L’âge limite d’un individu étant fixé à 70 ans par l’horloge (1 année = 365, 25 jours), au vu de l’erreur
d’arrondi est-ce que cela modifie significativement de l’espérance de vie ? Cela en fait perdre ou gagner ?
12. On considère un individu de matricule n. On dispose d’une fonction horloge(n) qui renvoie le flottant
égal à l’âge de l’individu converti en années et d’une fonction kill(n) qui permet d’envoyer un ordre à
la Police de la Pensée visant à supprimer l’individu.
Un de vos collègues du ministère de la Vérité a écrit la portion de code suivant qui est compilée ou exécutée
toute les 1/10 de seconde pour savoir quand on a atteint l’âge limite.
1 if horloge ( n )==70.0:
2 kill ( n )

Ce code va-t-il fonctionner ? Pourquoi ? Sinon le corriger afin qu’il fonctionne.

Fabien DÉLEN fdelen.maths@bbox.fr 3 PCSI 2021-2022


Lycée de l’Essouriau ÉPREUVE D’INFORMATIQUE Les Ulis

III COMPRESSION DES DONNÉES PERSONNELLES


Le satellite de surveillance BIGBRO de la police de la pensée dispose d’un système de télescope destiné à
la surveillance des sites sensibles.
Les images enregistrées par le télescope pendant une heure sont organisées sous la forme d’un cube (Figure
1) constitué d’un ensemble de 352 « tranches » (352 prises de vues en 1h) comportant une image en noir et
blanc de 64 pixels dans les deux directions spatiales x et y (image d’une zone 4 m2 ). Il est ensuite possible d’en
extraire une image à un instant k ∈ [[0, 351]] formée de pixels de coordonnées spatiales (xi , yj ) ∈ [[0, 63]]2 .
352 prises de vues

← image à un instant k

Figure 1 : Structure d’un cube de données du satellite

Les données sont stockées dans une liste image à 3 dimensions : chaque élément image[k] de image est la
photo à l’instant k. La variable image[k] est donc liste de listes et image[k][i][j] est la valeur du pixel de
coordonnées spatiales (xi , yj ) prise à l’instant k.

13. Écrire une fonction Variation(image,k) qui détecte si l’image prise à l’instant k et celle prise à l’instant
k+1 ont varié. On dit que l’image a varié s’il y a au moins 9 pixels dont les valeurs ont été modifiées. Cette
fonction doit renvoyer True s’il elles ont variée et False sinon.
14. En déduire une fonction Mouvement(image) qui renvoie False s’il n’y a pas eu de mouvement (images
toutes identiques) au cours de la prise de vues et sinon renvoie l’instant k auquel le premier mouvement
a été détecté.

Les contraintes technologiques liées au transfert de l’ensemble des données recueillies par le satellite vers la
Terre imposent une réduction de leur volume. Cela consiste en une compression des données prise en charge par
une unité de traitement numérique embarquée à bord du satellite. Cette compression doit toutefois s’effectuer
sans perte d’information. Après compression, la taille maximale attendue pour un cube de données est de 1 Mo
(1 mégaoctet soit 1000 kilo-octets).
A chaque pixel pi,j,k du cube de données (de coordonnées xi , yj et tk ) est associé une référence de couleur.
Cette dernière information est codée sur 12 bits.
15. A combien de bits correspond un octet ?
16. Déterminer en octets la taille d’un cube de données avant compression.
Si T et TC représentent respectivement la taille des données avant compression et après compression, le
taux de compression τ est défini comme : τ = T −TT .
C

17. Déterminer alors le taux de compression à appliquer aux données afin de respecter le cahier des charges.

Fabien DÉLEN fdelen.maths@bbox.fr 4 PCSI 2021-2022


Lycée de l’Essouriau ÉPREUVE D’INFORMATIQUE Les Ulis

La compression des données est réalisée à l’issue de l’acquisition d’une ligne (soit 64 pixels pour la dimension
spatiale et 352 longueurs d’onde pour la dimension temporelle). Les données sont traitées par blocs de 64 pixels
× 32 instants. L’algorithme mis en œuvre pour la compression est un algorithme dit entropique, qui réalise un
codage des données exploitant la redondance de l’information. L’exemple proposé ci-après permet d’en illustrer
le principe, avec le codage d’une suite de 10 entiers naturels.
Soit la série Sn de 10 entiers naturels sk ∈ [[0, 8]] : 4 − 5 − 7 − 0 − 7 − 8 − 4 − 1 − 7 − 4.
Un codage en binaire naturel des entiers 0 à 8 nécessitant au minimum 4 bits, le choix d’un tel codage pour la
série Sn conduirait à un code d’une longueur totale de 40 bits. La longueur du code associé à la série Sn peut
être réduite en adoptant un codage exploitant les propriétés suivantes de la série :
− seules 6 valeurs vi sont utilisées parmi les 9 possibles ;
− certaines valeurs vi possèdent des probabilités pi d’apparition plus importantes que d’autres.
Une solution consiste par exemple à adopter un codage à longueur variable, où les codes les plus courts sont
associés aux valeurs qui possèdent la probabilité d’apparition la plus importante. Un tel codage est proposé
dans le tableau 1 pour les entiers de la série Sn . La série Sn est alors codée de la manière suivante :

Les algorithmes de compression entropiques étant basés sur l’exploitation de la redondance dans les données
à coder, leur efficacité est directement liée à la « quantité d’information » qu’elles contiennent : plus il y a
répétitions de certaines valeurs dans les données à coder (l’entropie des données est alors faible), plus le taux
de compression atteint est élevé. Une valeur limite du taux de compression que l’on peut espérer atteindre peut
être approchée par le calcul de l’entropie de Shannon H, grandeur fournissant une mesure de la « quantité
d’information » contenue dans les données, en bits par caractère. Pour une série de données Sn (considérée
comme une variable aléatoire) l’entropie H est définie de la manière suivante :
Nv
X
H(Sn ) = − pi log2 (pi ), avec
i=1

• Nv : nombre de valeurs vi différentes contenues dans la série,


• pi : probabilité d’apparition de la valeur vi (pi = nni avec ni nombre d’occurrences de la valeur vi et n nombre
de termes de la série Sn )
ln(x)
• log2 : fonction logarithme binaire (base 2). Pour x ∈ R+ ∗ , log2 (x) = ln(2) .

18. Calculer l’entropie associée à l’exemple précédent. En déduire le taux de compression limite de cet exemple
et le comparer à la longueur moyenne de 2,4 bits par caractère.

Fabien DÉLEN fdelen.maths@bbox.fr 5 PCSI 2021-2022


Lycée de l’Essouriau ÉPREUVE D’INFORMATIQUE Les Ulis

IV SURVEILLANCE D’INDIVIDUS
Dans cette partie, Big Brother doit contrôler N individus, qui disposeront d’un numéro pris dans l’ensemble
[[0, N −1]]. La police de la Pensée a donc, comme précisé au I, attribué à chaque individu une note d’insoumission
(plus la note est faible, plus l’individu est rebelle). Ces notes sont toutes distinctes, et stockées dans une liste
notes, de telle sorte que notes[i] = k signifie que l’individu numéro i a la note k.
On disposera également dans cette partie d’une fonction envoyer_en_prison, telle que envoyer_en_prison(i,
notes) envoie automatiquement
√ en prison l’individu numéro i dans cette liste. Cette fonction renvoie None, et
a une complexité O( N ). On signale également qu’un individu envoyé en prison continue de figurer dans la
liste notes.
19. Écrire une fonction eliminer_le_chef(notes) qui prend en argument une liste de notes et envoie en
prison l’individu ayant la note la plus faible. Cette fonction renvoie None. Quelle est sa complexité ?
20. On se donne la fonction suivante qui trie une liste de flottants ou d’entiers.
1 def tri ( liste ):
2 N = len ( liste )
3 for i in range ( N ):
4 pos = i
5 while pos >0 and liste [ pos ] < liste [ pos -1]:
6 liste [ pos ] , liste [ pos -1]= liste [ pos -1] , liste [ pos ]
7 pos -=1

Après avoir appliqué la fonction, la liste en entrée est modifiée et triée, mais par ordre croissant ou
décroissant ? Détailler les étapes de la fonction avec la liste [4,1,7,2], et expliquer le principe de cet
algorithme de tri. Préciser également la complexité de cette fonction.
21. En déduire une fonction rompre_sedition(notes) qui envoie en prison les 10% des individus avec les
notes les plus faibles. Si le nombre d’individus n’est pas un multiple de 10, on arrondira le nombre d’envoi
au nombre entier supérieur. Cette fonction ne doit pas modifier la liste notes et ne renvoie rien.
22. On ne suppose plus nécessairement les notes distinctes. Écrire une fonction diconotes(notes) renvoie un
dictionnaire dont chaque clef est une note et la valeur associée est le nombre d’individus ayant cette note.

V ALGORITHME ANTI-MANIFESTATION
Dans cette partie, Big Brother cherche à empêcher tout embryon de manifestation. Les individus surveillés
sont assimilés à des points du carré [0, 1] × [0, 1], et l’objectif sera de retrouver efficacement les deux individus les
plus proches. On supposera de plus dans toute la partie que les abscisses des points sont deux-à-deux distinctes.
On suppose qu’on dispose de trois variables globales :
 N est le nombre de points,
 coords_x est une liste de N flottants distincts donnent les abscisses des points.
 coords_y est une liste de N flottants donnent les ordonnées des points.
Ainsi, les coordonnées du point numéro i sont (coords_x[i],coords_y[i]), pour 0 6 i 6 N − 1.
23. Dans la population entière q
On rappelle que la distance entre deux points A et B est définie par d(A, B) = (xB − xA )2 + (yB − yA )2 .
(a) Écrire une fonction distance(i,j) qui prend en argument deux numéros de points compris entre 0
et N-1 et renvoie la distance entre les individus portant ces matricules.
(b) Écrire une fonction plus_proche() qui renvoie une liste de deux numéros i et j correspondant à
deux points les plus proches. Donner en la justifiant la complexité de cet algorithme.

Fabien DÉLEN fdelen.maths@bbox.fr 6 PCSI 2021-2022


Lycée de l’Essouriau ÉPREUVE D’INFORMATIQUE Les Ulis

(c) Écrire une fonction trop_proches() qui renvoie une liste contenant toutes les listes de deux numéros
i et j de distance inférieure à 10−5 (unité de longueur du carré).
24. Regroupement par quartier
On admettra qu’on dispose de deux listes de N entiers liste_x et liste_y telles que les matricules dans
liste_x soient rangés par abscisses croissantes, et ceux dans liste_y par ordonnées croissantes.
Dans toute la suite, un ensemble de points sera décrit avec un cluster. Un cluster est une matrice de
deux lignes contenant chacune les mêmes numéros, qui sont les numéros des points dans le sous-ensemble
considéré. Dans la première ligne, les points sont triés par abscisses croissantes ; dans la seconde ils sont
triés par ordonnées croissantes. La figure 2 donne la représentation de deux clusters.

Figure 2 : Représentation en Python de deux cluster


Chaque quartier de la ville va être représenté par un « sous-cluster » du cluster de départ. On va donc
chercher à créer des « sous-cluster ».
(a) Que vaut le cluster cluster_c représentant le quartier contenant les points M2 , M4 , M5 , M6 , M7 de
la figure 2 ?
(b) Écrire une fonction sous_cluster(cl,x_min,x_max) qui prend en arguments un cluster cl, et deux
flottants x_min et x_max, et renvoie le sous-cluster des points dont l’abscisse est comprise entre x_min
et x_max (au sens large). On impose une complexité linéaire en la taille du cluster.
(c) Écrire une fonction mediane(cl) qui prend en entrée un cluster cl et renvoie une abscisse médiane,
c’est-à-dire que la moitié (au moins) des points a une abscisse inférieure ou égale à cette valeur, et
la moitié (au moins) des points a une abscisse supérieure ou égale à cette valeur.
Le but étant ensuite d’appliquer un algorithme dichotomique sur les clusters.

VI ATTRIBUTION D’UNE PLACE DE CELLULE EN PRISON


Les individus dangereux sont envoyé en prison remplie de cellules individuelles. On considère la prison comme
une allée à sens unique avec m cellules numérotées de 0 à m − 1.
On suppose qu’initialement les m cellules sont libres et que n prisonniers, numérotées de 0 à n − 1, arrivent
successivement dans la prison, et cherchent à choisir une cellule.
Le prisonnier numéro j entre dans l’allée des cellules et décide de choisir sa cellule alors qu’elle passe devant
la cellule Cj (avec Cj choisie aléatoirement telle que Cj ∈ {0, . . . , m − 1}).
— Si cette cellule est libre, le prisonnier s’y installe, sinon il avance dans l’allée et s’installe à la première
cellule libre.
— S’il n’y a pas de cellule libre, il est alors exécuté et son corps est recyclé pour fabriquer du Soylent Green.
(Les prisonniers ne sont bien entendu pas au courant de ce qui les attend et choisissent donc bien aléatoirement
le moment où ils souhaitent s’installer dans une cellule...)

Fabien DÉLEN fdelen.maths@bbox.fr 7 PCSI 2021-2022


Lycée de l’Essouriau ÉPREUVE D’INFORMATIQUE Les Ulis

25. On suppose que m = 4. Représenter l’état des quatre cellules (vide ou numéro de prisonnier l’occupant)
à l’état final dans les cas suivants :
 Cas n◦ 1 : n = 3 ; C0 = 2 ; C1 = 2 ; C2 = 0
 Cas n◦ 2 : n = 3 ; C0 = 2 ; C1 = 2 ; C2 = 3
 Cas n◦ 3 : n = 4 ; C0 = 1 ; C1 = 2 ; C2 = 0 ; C3 = 1
26. Écrire une fonction choix(m,n) prenant en arguments deux entiers (le nombre de cellules m dans la prison
et le nombre de prisonniers n) et renvoyant une liste C de longueur n, générée aléatoirement, dont chaque
élément C[j] correspond au numéro de la cellule en face de laquelle le prisonnier de numéro j choisit de
s’installer.
On pourra utiliser la fonction randint du module random : si a et b sont deux entiers, alors randint(a,b)
renvoie un entier aléatoirement dans l’intervalle d’entiers [[a, b]], incluant les deux bornes.
27. Écrire une fonction incarceration(m,C) dont les arguments sont un entier m (le nombre de cellules dans
la prison) et une liste C = [C0 , C1 , . . . , Cn−1 ] représentant les n prisonniers et le « moment » de leur
intention d’entrer dans une cellule qui renvoie la liste G de longueur m telle que, pour 0 6 i 6 m − 1, G[i]
soit égal au numéro du prisonnier installé à la cellule de numéro i ou à "*" si la cellule est encore vide.
28. En déduire une fonction cellule(m,C) de mêmes arguments qu’en question 26. et qui renvoie la liste N
de longueur n telle que, pour 0 6 j 6 n − 1, N[j] soit égal au numéro de la cellule où est incarcéré le
prisonnier numéro j ou à "*" si celui-ci ne s’est pas installé dans une cellule (et a fini en Soylent Green).
Un tel algorithme permet avec plusieurs simulations d’estimer la quantité de nourriture que l’on peut
produire avec m cellules et n prisonniers.

VII MATRICE DES QUARTIERS EN RÉVOLTE


Pour Big Brother, les quartiers de la ville sont maintenant assimilés à une grille rectangulaire de dimension
n × m. Certains quartiers sont tranquilles alors que d’autres sont en révolte. On attribue la valeur −1 aux
quartiers tranquilles, et on attribue aux quartiers en révolte une valeur entière correspondant au jour où ils
passent en révolte.
De plus, la révolte se répand : un quartier se révolte au jour k + 1 si au moins deux quartiers adjacents (les
diagonales ne comptent pas) sont en révolte au jour k. Un quartier en révolte le reste ensuite indéfiniment.
Un certain nombre de quartiers sont en révolte initialement et ont donc une valeur de 0. L’objectif est donc
de prédire quels quartiers seront finalement en révolte et à partir de quel moment. On montre sur la figure 3
comment évolue la contamination dans un cas particulier de quartier.
     
0 −1 −1 −1 0 −1 −1 −1 0 3 4 −1
 −1 −1 0 −1  →  1 −1 0 −1  → . . . →  1 2 0 −1 
0 −1 −1 −1 0 −1 −1 −1 0 3 4 −1
Figure 3 : Un exemple de quartier représenté aux jours 0, 1 et 4
29. Écrire les matrices représentant les quartiers aux jours 2 et 3 pour cet exemple.
30. Écrire une fonction compter_les_voisins(mat,i,j) qui renvoie le nombre de quartiers en révolte adja-
cents à celui de la case (i, j). (Attention, tous n’ont pas tous 4 quartiers adjacents ! )
31. En déduire une fonction propagation(mat,k) qui transforme une matrice mat correspondant à un état
de quartiers au jour k en la matrice correspondant à l’état des quartiers au jour suivant k+1.
32. En déduire finalement une fonction contamination(mat) qui transforme la matrice mat correspondant
à un état initial de quartiers (avec uniquement des -1 et des 0) en la matrice finale où il n’y a plus
d’évolution.
33. Hors-barème : Démontrer que si k cases sont contaminées initialement, on ne peut pas avoir plus de k 2
cases contaminées à la fin.

Fabien DÉLEN fdelen.maths@bbox.fr 8 PCSI 2021-2022

Vous aimerez peut-être aussi