Sujet bac : annale 2024 – centres étrangers groupe 1 – jour 1
1
Astuce
« Voisins » est une liste de listes. La première liste, d’index « 0 », correspond à la liste des voisins directs du nœud « 0 ». De la même manière, le seconde liste, d’index « 1 », correspond à la liste des voisins direct du nœud « 1 ». Et ainsi de suite.
Voisins=[[1,2,3,4],[0,2,3],[0,1],[0,1],[0]]
2
3
Voisins=[[1,2,3,4,5],[0,2,3],[0,1,5],[0,1],[0],[0,2]]
4
def voisin_alea(voisins, s):
return voisins[s][random.randrange(len(voisins[s]))]
Astuce
Remarque : si l’on considère que les graphes concernés par la fonction voisin_alea peuvent présenter un nœud isolé, c’est-à-dire sans voisin, un test sur la longueur de « voisins[s] » est nécessaire afin de traiter le cas d’un nœud isolé. Sinon, le cas d’un nœud isolé provoquerait une erreur.
5
La définition de la fonction marche_alea fait appel à elle-même (en ligne 4).
C’est la caractéristique d’une fonction récursive.
6
Cette fonction génère un trajet aléatoire, dans le graphe « voisins », à partir du nœud n° « i » et constitué de « n » étapes. Elle renvoie le numéro du dernier nœud de ce trajet.
En rapportant cette fonction au contexte de l’exercice, celle-ci modélise le trajet aléatoire du virus qui gagne « n » ordinateurs en partant de l’ordinateur « i » et affiche l’identité du nième ordinateur visité.
7
def simule(voisins, i, n_pas):
result=[0] * lens(voisins)
for test in range n_tests:
results[marche_alea(voisins, I, n_pas)]+=1
for noeud in range lens(voisins):
results[noeud] /= n_tests
return results
Astuce
On pourrait optimiser le code en remplaçant les 3 dernières lignes par :
return [noeud/n_tests for noeud in results]
8
On constate que près d’un tiers des 1 000 parcours aléatoires de 1 000 pas effectués par le virus à partir du nœud « 4 » se terminent au nœud « 0 », tous les autres nœuds n’atteignant pas ce score. Il semble donc prioritaire de protéger le nœud « 0 ».
9
Proposition du code Python implémentant l’algorithme demandé :
#importation importation de la bibliotheˋque random
import random
#initialisation des donneˊes avec celles de l’eˊnonceˊ
Voisins=[[1,2,3,4],[0,2,3],[0,1],[0,1],[0]]
s =1
#deˊfinition de la fonction marche_alea donneˊe en 4) de l’exercice
def marche_alea(voisins, i, n):
if n ==0
return i
return marche_alea(voisins, voisins[i][random.randrange(len(voisins[i]))], n-1)
#deˊfinition de la fonction demandeˊe nommeˊe temps_contamination
def temps_contamination(voisins, s) :
sommet = s
#initialisation du compteur de pas
pas =0
#initialisation de la liste des sommets contamines avec le premier sommet passeˊ en second argument de la fonction
contamines = [sommet]
#condition d’arreˆt de la fonction : lorsque le nombre de sommets visiteˊs est eˊgal au nombre de sommets du graphe "voisins »
while len(contamines) != len(voisins) :
sommet = marche_alea(voisins, sommet, 1)
if sommet not in contamines :
contamines += [sommet]
pas +=1
return pas
#appel de la fonction avec les donneˊes fournies par l’eˊnonceˊ
print (temps_contamination(voisins, s))
1
Les 16 bits positionnés à 1 correspondent à 255.255 pour la partie gauche de la notation décimale pointée.
La partie machine, qui se situe à droite de la notation décimale pointée, doit être à zéro.
Le masque de sous-réseau en notation décimale pointé est donc : 255.255.0.0.
2
L’adresse du réseau local L2 se déduit du masque de sous-réseau appliqué aux adresses des machines de ce sous-réseau.
On trouve ainsi : 172.16.0.0/16.
3
L’adresse de diffusion du réseau local L2 correspond à la partie gauche représentant l’adresse de ce sous-réseau, donc 172.16, et la partie droite dont tous les bits sont positionnés à 1 soit 255.255.
L’adresse de diffusion du réseau local L2 est donc : 172.16.255.255/16.
4
Le nombre maximum de machines pouvant être connectées au réseau local L2 correspond au nombre maximum d’adresses que l’on peut affecter entre 0.1 et 255.255 (partie droite de l’adresse réseau dont il faut exclure la valeur 0.0 réservée à l’adresse réseau et la valeur 255.255 réservée à l’adresse de diffusion).
Cela fait donc en tout 256 * 256 – 2 = 65634.
5
L1 → Routeur A → Interface 53.10.10.1 → Interface 53.10.2 → Routeur H → Interface 53.10.10.5 → Interface 53.10.10.6 → Routeur D → Interface 172.16.255.254 → L2
6
Deux chemins possibles :
- L1 → Routeur A → Routeur B → Routeur C → Routeur D → L2 (4 sauts)
- L1 → Routeur A → Routeur H → Routeur C → Routeur D →L2 (4 sauts)
Les autres, tels que par exemple L1 → Routeur A → Routeur H → Routeur F →Routeur E → Routeur D → L2 présentent plus de sauts.
Le protocole RIP reposant sur le nombre de sauts, celui-ci suivra l’un des deux seuls chemins ne présentant que 4 sauts.
7
Prenons le chemin L1 → Routeur A → Routeur B → Routeur C → Routeur D → L2.
Le seul routeur dans ce chemin dont les tables de routage sont impactées par la rupture de la liaison entre le routeur « H » et le routeur « D » est le routeur « A », dont la règle de routage pour joindre L2 doit être modifiée comme suit :
Routeur |
Réseau destinataire |
Passerelle |
Interface |
A |
L2 |
193.55.24.2 |
193.55.24.1 |
8
Bande passante |
Coût de la liaison |
10 Gbits/s |
(109)/(1010)=0,1 |
1 Gbits/s |
(109)/(109)=1 |
100 Mbits/s |
(109)/(108)=10 |
9
En privilégiant les liaisons à plus faible coût, on détermine assez rapidement que le chemin déterminé par le protocole OSPF entre L1 et L2 est le suivant :
Le coût total de ce chemin est donc de 10,1+0,1+0,1 soit 1,3.
10
On continue à privilégier les liaisons à plus faible coût.
On détermine alors le nouveau chemin suivant :
Le coût total de ce chemin est donc de 10,1+0,1+0,1 soit 1,3.
10
On continue à privilégier les liaisons à plus faible coût.
On détermine alors le nouveau chemin suivant :
IMAGE 03
Le coût total de ce chemin alors de 1+1+0,1+0,1 soit 2,2.
1
L’usage d’une base de données relationnelle présente de nombreux avantages, dont les suivants :
- cela évite la saisie d’informations redondantes et, par la même occasion, les risques d’incohérence ;
- cela permet d’effectuer des recherches complexes de façon rapide et fiable.
2
Pour qu’un attribut soit utilisé en tant que clé primaire d’une relation, les occurrences de cet attribut ne doivent prendre que des valeurs uniques dans cette relation.
3
Les clés étrangères « #id_client » et « #id_emplacement » dans la relation « Reservation » permettent de rattacher un client et un emplacement à une réservation donnée.
Ainsi, la clé étrangère « #id_client » fait référence à la clé primaire « id_client » de la relation « Client ». La table « Client » est ainsi mise en relation avec la table « Reservation ».
De la même manière, la clé étrangère « #id_emplacement » fait référence à la clé primaire « id_emplacement » de la relation « Emplacement ». La table « Emplacement » est ainsi mise en relation avec la table « Reservation ».
4
Schéma relationnel de la relation « Emplacement » :
Emplacement (id_emplacement : INT , nom : CHAR, localisation : CHAR, tarif_journalier: FLOAT)
5
Cette requête recherche dans la table « Emplacement » (FROM Emplacement), les enregistrements dont le champ « tarif_journalier » a une valeur de 25 (WHERE tarif_journalier =25) et affiche les champs « id_emplacement », « nom » et « localisation » de ces enregistrements (SELECT id_emplacement, nom, localisation).
Le résultat qu’affiche cette requête est par conséquent :
Id_emplacement |
nom |
localisation |
1 |
myrtille |
A4 |
4 |
mandarine |
B1 |
6 |
melon |
A2 |
6
SELECT nom, prenom
FROM Client
WHERE ville =′Strasbourg′
7
INSERT INTO Client
VALUES (42, ′CODD′, ′Edgar′, ′28 rue des Capucines′, ′Lyon′, ′France′, ′0555555555′) ;
8
SELECT Client.nom, Client.prenom, Reservation.nombre_personne, Reservation.date_arrivee,Reservation.date_depart, Emplacement.tarif_journalier
FROM Reservation
JOIN Client ON Client.id_client = Reservation.id_client
JOIN Emplacement ON Emplacement.id_emplacement = Reservation.id_emplacement
AND Reservation.reservation÷textunderscore id = 18 ;
9
Le terme « self » fait référence à l’instance courante. Celle-ci est passée en paramètre à des méthodes de la classe dont elle est issue.
10
client01 = Client(′CODD′, ′Edgar′, ′28 rue des Capucines′, ′Lyon′, ′France′, ′0555555555′
11
def montant_a_regler(triplet):
""" renvoie le montant en euros
aˋ reˊgler pour cette reˊservation """
client, reservation, emplacement = triplet
return reservation.nb_jours() *(2.20 * reservation.nombre_personne + emplacement.tarif_journalier)
Astuce
Remarque : le nombre de jours de réservation dans le calcul dont le résultat est retourné a été mis en facteur.
12
L’erreur se produit au niveau de la ligne de code 25 dans laquelle la variable « année » fait l’objet d’une comparaison avec les entiers 2018 et 2024. En effet, cette comparaison échoue car le type de la variable « année » est une chaîne de caractère. La comparaison d’une chaîne de caractères à un entier provoque donc une erreur.
13
Proposition de correction :
if not(len(annee) == 4) or not(2018 <= int(anneˊe) <= 2024):
Astuce
Remarque : le fait que dans les deux lignes de code précédentes (23 et 24) on ait vérifié que la chaîne « année » ne soit constituée que de chiffres nous garantit que l’instruction int(anneˊe) proposée en correction ne provoquera jamais d’erreur.
14
if not (mois in calendrier):
return false
if not(len(numero) == 3) or not(que_des_chiffres(numero)):
return false