Académique Documents
Professionnel Documents
Culture Documents
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.
AVERTISSEMENT
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.)
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.
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.
← image à un instant k
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.
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
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.
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.
(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.
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.