Chemin dans un réseau (1)

On considère le réseau local d'un Lycée relié au réseau local d'une Maison et à une Webcam au travers de quatre routeurs nommés Routeur1, Routeur2, Routeur3 et Routeur4. Les routeurs, les réseaux locaux et la webcam constituent les nœuds d'un réseau public.

On peut modéliser cette interconnexion par un graphe comme ci-dessous :

Exemple de réseau
flowchart LR
    A([Lycee]) <--> B([Routeur1])
    B <--> E([Routeur2])
    C([Webcam]) <--> B
    D([Routeur3]) <--> G([Maison])
    D <--> E
    E <--> F([Routeur4])
    F <--> D

Chaque nœud dispose d'une table de routage qui lui associe, pour chaque nœud d'arrivée, la prochaine étape du chemin. Si une destination n'est pas référencée dans la table de routage, on utilise une route par défaut, indiquée ici par "Autres".

Ainsi la table de routage du Routeur2 est la suivante :

Destination Prochaine étape
Lycee Routeur1
Webcam Routeur1
Autres Routeur4

Quand un paquet arrive sur un routeur, on vérifie si l'adresse est présente dans la table de routage et on trouve la prochaine étape. Si l'adresse n'est pas présente, on prend la route par défaut.

Ainsi, si un paquet arrive au Routeur2 avec pour adresse de destination Maison, il est redirigé vers le Routeur4.

Une table de routage est représentée en Python par un dictionnaire dont :

  • les clés sont les chaînes de caractères correspondant aux noms des nœuds de destination, ou "Autres" pour la route par défaut,

  • les valeurs associées sont des chaînes de caractères représentant les nœuds vers lesquels sont redirigés les paquets.

Table de routage du Routeur2
table_routeur2 = {
    "Lycee":  "Routeur1",
    "Webcam": "Routeur1",
    "Autres": "Routeur4"
}

On représente l'ensembles des tables de routage dans un dictionnaire associant à chaque nœud du réseau sa table de routage. On souhaite pouvoir déterminer à l'aide de celles-ci le chemin emprunté par un paquet émis d'un nœud du réseau vers un autre.

Exemple

Un paquet issu du réseau du Webcam et adressé à celui de la Maison devra emprunter le chemin WebcamRouteur1Routeur2Routeur4Routeur3Maison.

Dans le cas où les réseaux d'arrivée et de départ sont identiques, les paquets ne sortent pas du réseau.

Écrire une fonction récursive trouver_chemin qui :

  • prend en paramètres un dictionnaire reseau représentant un tel réseau, deux chaînes de caractères depart et arrivee qui représentent les nœuds de départ et d'arrivée ;

  • renvoie la liste des nœuds représentant le chemin parcouru, en incluant les nœud de départ et d'arrivée.

On garantit qu'il existe un tel chemin entre chaque paire de nœuds du réseau.

Exemples
>>> trouver_chemin(mon_reseau, "Webcam", "Maison")
['Webcam', 'Routeur1', 'Routeur2', 'Routeur4','Routeur3', 'Maison']
>>> trouver_chemin(mon_reseau, "Lycee", "Lycee")
['Lycee']

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013s3o_8bcdufvg/0ly n7AapS.r1me,(P2=4:twki9][5h)6050i0C0K0v0N0p0b0r0h0p0v0b0b0H010K0N0w010406050b0j0B0B0v0z0q040x0d0p0j0/0d0s050n0_0{0}0 0@0w04181f051i0n1i1k1f0@0i0N0l0%0)0+0-0S0N0m0S0p1y0S0K0=050Y0g0p0C1t0*0,011x1z1B1z0K1H1J1F0K0g0d0i0 1G0z1g0K0S0%120b0w0v0s0-0G011L1v010k0!0C0s0v0B0C1F1-1/1@1N1`1J1}1 0=0a0r0F0z0d0w0d0b0N150s0r0W1+0z0z0C0h2k18220s1g0n1)2x0K1%1$1(0i240-1B0s1|2h1F1q1s0(1M2H0N2J0s1Z1r1F0w2q1g2v2x2#0^1.2l2P1^2U0z0|0p0=0r0A2u2)0?2(232+1N2-2/2;0G2@1/2_2v2G012~0v2:040r0c322w0@352|0-383a0r0I3e342)363k2;0R3o3g3q3i370d2.392;0U3v2`2*1u2}3A2 3b0t3F3h3I3j3K3C3b0f3O3x3Q3z3B3l0O3W2{3Y3s040A0o3%3H2Q3Z3L0A2?192^1h2Z182N2A0i2E360h1Z201g3}1j3{2%3^3305420W2!3X3:0M0=0W0k3o3G360L2;4m3P3:0s0k0=2B0d0j0l0C0z0e0h0S0C0B2S4r4g1^0;040E4J3(4t0=2q0b0C0v0j4P3/4L0=0D3o0r4n3y0s4j0C1.0z0K4Y364M4$4a2w4(4s2,0=0}0z1r0C0C4;3y4M0T0J3v0r594`4K2}0=2g2i2t4^3b4)3Y0d0=0H4%5k4R040W4.4:5i065a5b4Q4|044E4G4I5i5z4Z1N5m045o5G5q4!040Q533)4,5u5S3:4M0P585a5O1N4i040L1x1J5p4{5J4p042U5v2#5H3r5e2h2j0N165-5c0-5K0H5M5@5$3j4}2p50525i66014M575w5y5y6d4+041U0C0e2e140v0m6b655.615n5 5A5d044T4V4X6c6w6e0=5R6G60375`5g5}176L6A0-5Y5!6i5^3y5(0N4l5N6H6l4~6a6z5I615:5F6v6M6l6n6p4y0Y6t5W5P6g2#5x6X6i6k6O5|5~6%6M626,5_6m0v1I6o6q6`6u3_6H4M6K2%6(684 4A7i4b7k0=5Z6h716d5(0C0#7s2w6d6f6W715973045f756R6;6T0179777Q6?7d1J6^6r6{6S6-6I5Q6|1N0b1=04010u144T017)6U7v7H6j7o5C4F4H7O7j780=0y7?6N040v0w0w1|0i844M4O7#7b7M5h7n6M557H7z4S0X0j0z7 336Y5T7|5E8s3f184d0C2x2Y8C3|1r3~2A2C2y1Y1!2A7W8F0n3}0@8R0X0Z0#04.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013s3o_8bcdufvg/0ly n7AapS.r1me,(P2=4:twki9][5h)6050i0C0K0v0N0p0b0r0h0p0v0b0b0H010K0N0w010406050b0j0B0B0v0z0q040x0d0p0j0/0d0s050n0_0{0}0 0@0w04181f051i0n1i1k1f0@0i0N0l0%0)0+0-0S0N0m0S0p1y0S0K0=050Y0g0p0C1t0*0,011x1z1B1z0K1H1J1F0K0g0d0i0 1G0z1g0K0S0%120b0w0v0s0-0G011L1v010k0!0C0s0v0B0C1F1-1/1@1N1`1J1}1 0=0a0r0F0z0d0w0d0b0N150s0r0W1+0z0z0C0h2k18220s1g0n1)2x0K1%1$1(0i240-1B0s1|2h1F1q1s0(1M2H0N2J0s1Z1r1F0w2q1g2v2x2#0^1.2l2P1^2U0z0|0p0=0r0A2u2)0?2(232+1N2-2/2;0G2@1/2_2v2G012~0v2:040r0c322w0@352|0-383a0r0I3e342)363k2;0R3o3g3q3i370d2.392;0U3v2`2*1u2}3A2 3b0t3F3h3I3j3K3C3b0f3O3x3Q3z3B3l0O3W2{3Y3s040A0o3%3H2Q3Z3L0A2?192^1h2Z182N2A0i2E360h1Z201g3}1j3{2%3^3305420W2!3X3:0M0=0W0k3o3G360L2;4m3P3:0s0k0=2B0d0j0l0C0z0e0h0S0C0B2S4r4g1^0;040E4J3(4t0=2q0b0C0v0j4P3/4L0=0D3o0r4n3y0s4j0C1.0z0K4Y364M4$4a2w4(4s2,0=0}0z1r0C0C4;3y4M0T0J3v0r594`4K2}0=2g2i2t4^3b4)3Y0d0=0H4%5k4R040W4.4:5i065a5b4Q4|044E4G4I5i5z4Z1N5m045o5G5q4!040Q533)4,5u5S3:4M0P585a5O1N4i040L1x1J5p4{5J4p042U5v2#5H3r5e2h2j0N165-5c0-5K0H5M5@5$3j4}2p50525i66014M575w5y5y6d4+041U0C0e2e140v0m6b655.615n5 5A5d044T4V4X6c6w6e0=5R6G60375`5g5}176L6A0-5Y5!6i5^3y5(0N4l5N6H6l4~6a6z5I615:5F6v6M6l6n6p4y0Y6t5W5P6g2#5x6X6i6k6O5|5~6%6M626,5_6m0v1I6o6q6`6u3_6H4M6K2%6(684 4A7i4b7k0=5Z6h716d5(0C0#7s2w6d6f6W715973045f756R6;6T0179777Q6?7d1J6^6r6{6S6-6I5Q6|1N0b1=04010u144T017)6U7v7H6j7o5C4F4H7O7j780=0y7?6N040v0w0w1|0i844M4O7#7b7M5h7n6M557H7z4S0X0j0z7 336Y5T7|5E8s3f184d0C2x2Y8C3|1r3~2A2C2y1Y1!2A7W8F0n3}0@8R0X0Z0#04.