UPMC
c - Informatique - 1I001 - page 1 -
Exercice 1 : Organisation du festival Elem-o-Prog
Chaque année, le Festival Elem-o-Prog a lieu le 1er janvier, entre 0h et 24h.
Les groupes de musique envoient une demande de concert, sous la forme d’une chaîne de caractères
avec un format bien précis : ’XX-nom-YY’. Les 2 caractères XX correspondent à l’heure de début
(un nombre entier à 2 chiffres compris entre 00 et 23) et les caractères YY correspondent à l’heure
de fin (un nombre entier à 2 chiffres compris entre 01 et 24) tels que XX < YY. Enfin ’nom’ est
le nom de leur groupe.
Ainsi la chaîne ’06-LesPtitsDej-10’ correspond au groupe ’LesPtitsDej’ qui souhaite
jouer de 6h à 10h.
L’exercice consiste à sélectionner des concerts dont les horaires sont compatibles.
Réponse
def extraction_concert(demande):
""" str -> (str, int, int)
H: demande est bien formattee"""
UPMC
c - Informatique - 1I001 - page 2 -
>>> liste_concerts(Demandes)
[(’Les7:9’, 7, 9), (’LesNoctambules’, 22, 23), (’LesPtitsDej’, 6, 10),
(’Aube’, 6, 7), (’LeveTot’, 2, 5)]
Réponse
def liste_concerts(L):
""" list[str] -> list[ (str, int, int) ] """
return R
La liste des triplets de concerts est triée suivant l’heure de début de chaque concert. Voilà le
résultat obtenu :
# Concerts : list[(str, int, int)]
Concerts = [ (’LeveTot’,2, 5), (’LesPtitsDej’, 6, 10), (’Aube’,6, 7),
(’Les7:9’, 7, 9), (’LesNoctambules’, 22, 23) ]
On reçoit une nouvelle demande d (de type str). On veut insérer le triplet concert associé à d,
dans la liste de triplets déjà triée suivant l’heure de début (la liste est éventuellement vide). On
veut le placer à la première position possible qui respecte l’ordre croissant de début de
concert.
Question 1.3 : [4/66]
Donner une définition avec signature et hypothèse(s) éventuelle(s) de la fonction indice qui,
étant donné une demande d, et une liste de triplets concerts triée Concerts, renvoie l’indice
où l’insertion doit se faire. Par exemple :
>>> indice(’20-LeVingtHeure-21’, Concerts)
4
>>> indice(’22-LesDer-24’, Concerts)
4
>>> indice(’23-GongFinal-24’, Concerts)
5
>>> indice(’20-LeVingtHeure-21’, [])
0
Attention : la fonction indice peut ne pas être correcte si en entrée, la liste n’est pas triée
suivant le début de concert.
UPMC
c - Informatique - 1I001 - page 3 -
Réponse
Réponse
#i : int
i = indice(d, L)
UPMC
c - Informatique - 1I001 - page 4 -
>>> Concerts2
[(’LeveTot’, 2, 5), (’LesPtitsDej’, 6, 10), (’Aube’, 6, 7), (’Les7:9’, 7, 9),
(’LeVingtHeure’, 20, 21), (’LesDer’, 22, 24), (’LesNoctambules’, 22, 23)]
Réponse
return f1 <= d2
UPMC
c - Informatique - 1I001 - page 5 -
Réponse
def liste_compatible(L):
""" list[(str, int, int)] -> list[(str, int, int)] """
if L == []:
return []
# i : int
for i in range(1, len(L)):
if est_compatible(R[-1], L[i]):
R.append(L[i])
return R
On suppose que dans un Reseau, les valeurs ne sont composées que d’éléments qui sont des clefs
du réseau. On ne peut pas avoir comme amie une personne qui n’est pas dans le réseau.
Pour les tests, on considère le réseau suivant :
VL = {’Amine’ : {’Barbara’, ’Daniel’, ’Frank’},
’Barbara’: {’Amine’, ’Charles’, ’Daniel’},
’Charles’: {’Barbara’},
’Daniel’: {’Charles’, ’Barbara’},
’Emilie’: set(),
’Frank’: {’Amine’, ’Daniel’}}
UPMC
c - Informatique - 1I001 - page 6 -
Réponse
return len(reseau[pers])
Réponse
Réponse
def scores(r):
""" Reseau -> dict[str:int]"""
UPMC
c - Informatique - 1I001 - page 7 -
Question 2.4 : [4/66]
Donner une définition avec signature et hypothèse(s) éventuelle(s) de la fonction relations qui
prend en entrée un réseau res et un ensemble pers de personnes de res et renvoie le dictionnaire
correspondant au sous-réseau de res composé des personnes de pers uniquement ; c’est à-dire le
réseau contenant uniquement les personnes pers et les même relations d’amitiés que dans res.
>>> relations(VL, {’Amine’, ’Barbara’, ’Daniel’})
{’Daniel’: {’Barbara’},
’Barbara’: {’Daniel’, ’Amine’},
’Amine’: {’Daniel’, ’Barbara’}}
>>> relations(VL, {’Charles’, ’Emilie’})
{’Charles’: set(), ’Emilie’: set()}
>>> relations(VL, set())
dict()
Réponse
Dans un second temps, on modélise un réseau social professionnel comme un dictionnaire (de
type dict[str:tuple[str,str,set[str]]]) où les clefs sont des personnes, et les valeurs
associées sont des triplets (tuple[str, str, set[str]]) représentant
i) l’entreprise actuelle de la personne (par exemple ’COGIP’),
ii) le poste qu’occupe actuellement la personne (par exemple ’commercial’),
iii) l’ensemble des contacts de cette personne, c’est-à-dire les noms des personnes du réseau
professionnel qu’elle connaît, un set[str] (par exemple {’Bob’, ’Carole’,’Etienne’}).
Cette dernière relation n’est pas forcément réciproque.
On utilise l’alias de type ReseauPro :
# type ReseauPro = dict[str:tuple[str,str,set[str]]]
On suppose que, dans un ReseauPro, les ensembles présents en troisième position dans les valeurs
(les ensembles de contacts) ne contiennent que des éléments qui sont des clefs du réseau. On ne
peut pas avoir dans son ensemble de contacts une personne qui n’est pas une clef du réseau.
Pour les tests, on considère le réseau suivant :
LD = {’Alice’ : (’COGIP’, ’commercial’, {’Bob’, ’Carole’, ’Etienne’}),
’Bob’ : (’COGIP’, ’directeur’, {’Alice’}),
’Carole’ : (’COFRAP’, ’commercial’, {’Alice’, ’Bob’, ’Fanny’}),
’Damien’ : (’SOGEREC’, ’commercial’, {’Carole’}),
’Etienne’ : (’COGIP’, ’commercial’, {’Alice’, ’Bob’}),
’Fanny’ : (’COFRAP’, ’remouleur’, {’Carole’})}
UPMC
c - Informatique - 1I001 - page 8 -
postes présents dans res et la valeur associée à un poste est le nombre de personnes de res qui
occupent actuellement ce poste.
>>> metiers(LD)
{’directeur’: 1, ’commercial’: 4, ’remouleur’: 1}
>>> metiers(dict())
dict()
Réponse
def metiers(reseau):
""" ReseauPro -> dict[str:int] """
# DR : dict[str:int]
D = dict()
Réponse
UPMC
c - Informatique - 1I001 - page 9 -
UPMC
c - Informatique - 1I001 - page 10 -
Exercice 3 : Ensemble de Mandelbrot
Dans tout l’exercice, on considérera que l’import de la bibliothèque math a été fait au préalable.
Un point du plan est représenté par un couple de nombres flottants représentant son abscisse et
son ordonnée. On utilise l’alias de type Point :
# type Point = tuple[float,float]
Réponse
def module(pt):
""" Point -> float """
# x:float, y:float
x,y = pt
return math.sqrt(x**2 + y**2)
Pour chaque point de coordonnées (a, b), on définit la suite (de points (xn , yn )n∈N ) suivante :
x0 = y0 = 0
xn+1 = x2n − yn2 + a (1)
yn+1 = 2xn yn + b
UPMC
c - Informatique - 1I001 - page 11 -
Réponse
# a:float, b:float
a,b = c
# x:float, y:float
x,y = pt
return (x**2 - y**2 + a, 2*x*y + b)
Réponse
return module(pt)<mod_max
Étant donné debut, la borne inférieure d’un intervalle de longueur lg et un entier nb_pas, on
souhaite découper l’intervalle en nb_pas sous-intervalles. Par exemple, si on découpe l’intervalle
donné par debut = 2 et lg = 4, c’est-à-dire l’intervalle [2, 6], avec nb_pas = 4, on obtient
les 4 sous-intervalles [2, 3]; [3, 4]; [4, 5] et [5, 6].
On représente le résultat du découpage en la liste des coordonnées des extrémités des sous-
intervalles : [2, 3, 4, 5, 6].
Par ailleurs, le même intervalle peut-être découpé avec nb_pas = 5, on obtient alors la liste
[2, 2.8, 3.6, 4.4, 5.2, 6].
UPMC
c - Informatique - 1I001 - page 12 -
Question 3.4 : [2/66]
Donner une définition avec signature et hypothèse(s) éventuelle(s) de la fonction decoupage qui,
étant donné deux nombres flottants debut et lg et un entier nb_pas, renvoie la liste des coor-
données du découpage.
>>> decoupage(2.0, 4.0, 4)
[2.0, 3.0, 4.0, 5.0, 6.0]
>>> decoupage(-1.0, 4.0, 8)
[-1.0, -0.5, 0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0]
Remarque : Un bonus de 2 points sera accordé si la réponse est donnée avec une compréhension.
Réponse
La donnée d’un point coin et d’une longueur lg, définit un unique carré, dont le coin inférieur
gauche est le point coin, dont les côtés, de longueur lg, sont parallèles aux axes.
Ainsi pour le point coin = (2,1) de lg = 2, on définit le carré de sommets (2, 1); (4, 1); (4, 3)
et (2, 3).
On construit un ensemble de points, espacés de façon régulière sur le carré avec un nombre de pas
défini par l’entier nb_pas. Cet ensemble de point est appelé maillage. Sur la figure suivante, on
a représenté à gauche le maillage avec coin = (2.0, 1.0), lg = 2.0 et nb_pas = 2 et à
droite, le maillage avec coin = (1.0, 1.0), lg = 2.0 et nb_pas = 8.
UPMC
c - Informatique - 1I001 - page 13 -
Question 3.5 : [3/66]
Donner une définition avec signature et hypothèse(s) éventuelle(s) de la fonction
maillage(coin, lg, nb_pas) qui renvoie l’ensemble des points du maillage.
>>> maillage((2.0, 1.0), 2.0, 2)
{(3.0, 2.0), (3.0, 3.0), (3.0, 1.0), (2.0, 1.0), (2.0, 3.0), \
(4.0, 3.0), (2.0, 2.0), (4.0, 2.0), (4.0, 1.0)}
Réponse
# debut_x:float debut_y:float
debut_x, debut_y = coin
# dec_x:list[float] dec_y:list[float]
dec_x = decoupage(debut_x, lg, nb_pas)
dec_y = decoupage(debut_y, lg, nb_pas)
L’ensemble de Mandelbrot est un ensemble de points du plan formant une fractale. Sur la figure
suivante, on visualise deux approximations d’une partie de la fractale.
Afin d’approximer l’ensemble de Mandelbrot, on retient chaque point c d’un maillage si la suite
associée, définie par l’équation (1), avant la question 2 est bornée.
UPMC
c - Informatique - 1I001 - page 14 -
qui renvoie l’ensemble des points du maillage appartenant à l’ensemble de Mandelbrot.
Sur la Figure 2, on a représenté, à gauche, l’ensemble de points obtenus via l’appel
mandelbrot((-1.0,-1.0), 2.0, 300, 12, 2). À droite, on a représenté les points de
mandelbrot((0.3,0.45), 0.1, 200, 30, 2).
Sur un maillage plus petit, on obtient par exemple
>>> mandelbrot((-0.5,-1.0), 1.0, 2, 12, 2)
{(-0.5, -0.5), (-0.5, 0.0), (0.0, -1.0), (0.0, -0.5), (0.0, 0.0)}
Réponse
UPMC
c - Informatique - 1I001 - page 15 -
def max_et_reste(L):
Hyp:
renvoie le maximum de la liste L et une liste contenant
tous les elements de L moins une occurrence du maximum"""
# max :
max = L[0]
# LR :
LR = []
# e :
for e in L[1:]:
if e > max:
LR.append(max)
max = e
else:
LR.append(e)
return (max, LR)
UPMC
c - Informatique - 1I001 - page 16 -
Réponse
list[Number].
def max_et_reste(L):
""" list[Number] -> tuple[Number, list[Number]]
H: len(L) > 0
renvoie le maximum de L et une liste contenant
tous les elements de L sauf une occurence du maximum"""
# max : Number
max = L[0]
# LR : list[Number]
LR = []
# e : Number
for e in L[1:]:
if e > max:
LR.append(max)
max = e
else:
LR.append(e)
return (max, LR)
UPMC
c - Informatique - 1I001 - page 17 -
Question 4.2 : [2/66]
Donner un jeu de trois tests caractéristiques pour max_et_reste.
Remarque : Il est probablement nécessaire d’effectuer une ou plusieurs simulations (sur un
brouillon) pour comprendre le fonctionnement de max_et_reste et pour donner des tests perti-
nents. On ne demande pas de faire figurer ces simulations sur la copie.
Réponse
UPMC
c - Informatique - 1I001 - page 18 -
On se sert de la fonction max_et_reste pour écrire une fonction tri_sel (pour "tri par sé-
lection") qui prend en entrée une liste L et renvoie une liste correspondant à L triée par ordre
décroissant.
def tri_sel(L):
# LR :
LR = []
# T :
T = L[:]
# paire :
paire = (0, [])
while T != []:
paire = max_et_reste(T)
#g : , d :
g, d = paire
LR.append(g)
T = d
return LR
UPMC
c - Informatique - 1I001 - page 19 -
Réponse
def tri_sel(L):
""" list[Number] -> list[Number]
renvoie la liste L triee dans l’ordre decroissant"""
# LR : list[Number]
LR = []
# T : list[Number]
T = L[:]
# paire : tuple[Number, list[Number]]
paire = (0, [])
while T != []:
paire = max_et_reste(T)
#g : Number, d : list[Number]
g, d = paire
LR.append(g)
T = d
return LR
entrée
1er
Réponse
UPMC
c - Informatique - 1I001 - page 20 -
Tour Variable paire Variable LR Variable T
UPMC
c - Informatique - 1I001 - page 21 -
Réponse
Réponse
len(T) est un bon variant pour tri_sel, il décroit strictement à chaque tour de boucle (car
la longueur de T est décrémentée) et on sort de la boucle quand il vaut 0 (car T vaut []).
UPMC
c - Informatique - 1I001 - page 22 -
Question 4.7 : [0/66]
On s’intéresse à l’efficacité de tri_sel.
Lors d’un appel sur une liste de n éléments, combien de comparaisons > sont faites par la fonction
max_et_reste ?
En déduire combien de comparaisons > sont faites lors d’un appel à la fonction tri_sel sur une
liste de n éléments.
Remarque : Cette question, hors-programme, est notée sur 3 points bonus.
Réponse
Appelée sur une liste L, la fonction max_et_reste effectue une comparaison > pour chaque
élément de L[1:]. Elle effectue donc n − 1 comparaisons > si L a la taille n.
La fonction tri_sel appelle max_et_reste sur T à chaque tour de boucle et fait donc, à
chaque tour, autant de comparaisons que len(T)-1.
Quand on appelle tri_sel sur une liste L de taille n, au premier tour, comme T vaut L, on
effecture n − 1 comparaisons > ; au deuxième tour, T a un élément en moins et est donc de taille
n − 1, on effectue donc n − 2 comparaisons ; au troisième tour, on effectue n − 3 comparaisons ;
. . ., au dernier tour, T a la taille 1, on effectue 0 comparaisons.
Au final, le nombre de comparaisons > effectuées est :
n−1
X n ∗ (n − 1)
(n − 1) + (n − 2) + (n − 3) + . . . + 0 = k=
2
k=0
UPMC
c - Informatique - 1I001 - page 23 -