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 Webcam → Routeur1 → Routeur2 → Routeur4 → Routeur3 → Maison.

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

.128013:pbv(40i2edm3s7= 1o5w_lSAnatf)9h]6,crg.[yPku8/050l0k0C0B0i0x0o0r0K0x0B0o0o0q010C0i0c010406050o0S0m0m0B0L0P040y0t0x0S0/0t0A050U0_0{0}0 0@0c04181f051i0U1i1k1f0@0l0i0e0%0)0+0-0G0i0M0G0x1y0G0C0=050Y0d0x0k1t0*0,011x1z1B1z0C1H1J1F0C0d0t0l0 1G0L1g0C0G0%120o0c0B0A0-0j011L1v010D0!0k0A0B0m0k1F1-1/1@1N1`1J1}1 0=0a0r0Q0L0t0c0t0o0i150A0r0W1+0L0L0k0K2k18220A1g0U1)2x0C1%1$1(0l240-1B0A1|2h1F1q1s0(1M2H0i2J0A1Z1r1F0c2q1g2v2x2#0^1.2l2P1^2U0L0|0x0=0r0s2u2)0?2(232+1N2-2/2;0j2@1/2_2v2G012~0B2:040r0n322w0@352|0-383a0r0g3e342)363k2;0u3o3g3q3i370t2.392;0I3v2`2*1u2}3A2 3b0p3F3h3I3j3K3C3b0T3O3x3Q3z3B3l0F3W2{3Y3s040s0h3%3H2Q3Z3L0s2?192^1h2Z182N2A0l2E360K1Z201g3}1j3{2%3^3305420W2!3X3:0R0=0W0D3o3G360v2;4m3P3:0A0D0=2B0t0S0e0k0L0w0K0G0k0m2S4r4g1^0;040f4J3(4t0=2q0o0k0B0S4P3/4L0=0J3o0r4n3y0A4j0k1.0L0C4Y364M4$4a2w4(4s2,0=0}0L1r0k0k4;3y4M0E0b3v0r594`4K2}0=2g2i2t4^3b4)3Y0t0=0q4%5k4R040W4.4:5i065a5b4Q4|044E4G4I5i5z4Z1N5m045o5G5q4!040O533)4,5u5S3:4M0H585a5O1N4i040v1x1J5p4{5J4p042U5v2#5H3r5e2h2j0i165-5c0-5K0q5M5@5$3j4}2p50525i66014M575w5y5y6d4+041U0k0w2e140B0M6b655.615n5 5A5d044T4V4X6c6w6e0=5R6G60375`5g5}176L6A0-5Y5!6i5^3y5(0i4l5N6H6l4~6a6z5I615:5F6v6M6l6n6p4y0Y6t5W5P6g2#5x6X6i6k6O5|5~6%6M626,5_6m0B1I6o6q6`6u3_6H4M6K2%6(684 4A7i4b7k0=5Z6h716d5(0k0#7s2w6d6f6W715973045f756R6;6T0179777Q6?7d1J6^6r6{6S6-6I5Q6|1N0o1=04010z144T017)6U7v7H6j7o5C4F4H7O7j780=0N7?6N040B0c0c1|0l844M4O7#7b7M5h7n6M557H7z4S0X0S0L7 336Y5T7|5E8s3f184d0k2x2Y8C3|1r3~2A2C2y1Y1!2A7W8F0U3}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

.128013:pbv(40i2edm3s7= 1o5w_lSAnatf)9h]6,crg.[yPku8/050l0k0C0B0i0x0o0r0K0x0B0o0o0q010C0i0c010406050o0S0m0m0B0L0P040y0t0x0S0/0t0A050U0_0{0}0 0@0c04181f051i0U1i1k1f0@0l0i0e0%0)0+0-0G0i0M0G0x1y0G0C0=050Y0d0x0k1t0*0,011x1z1B1z0C1H1J1F0C0d0t0l0 1G0L1g0C0G0%120o0c0B0A0-0j011L1v010D0!0k0A0B0m0k1F1-1/1@1N1`1J1}1 0=0a0r0Q0L0t0c0t0o0i150A0r0W1+0L0L0k0K2k18220A1g0U1)2x0C1%1$1(0l240-1B0A1|2h1F1q1s0(1M2H0i2J0A1Z1r1F0c2q1g2v2x2#0^1.2l2P1^2U0L0|0x0=0r0s2u2)0?2(232+1N2-2/2;0j2@1/2_2v2G012~0B2:040r0n322w0@352|0-383a0r0g3e342)363k2;0u3o3g3q3i370t2.392;0I3v2`2*1u2}3A2 3b0p3F3h3I3j3K3C3b0T3O3x3Q3z3B3l0F3W2{3Y3s040s0h3%3H2Q3Z3L0s2?192^1h2Z182N2A0l2E360K1Z201g3}1j3{2%3^3305420W2!3X3:0R0=0W0D3o3G360v2;4m3P3:0A0D0=2B0t0S0e0k0L0w0K0G0k0m2S4r4g1^0;040f4J3(4t0=2q0o0k0B0S4P3/4L0=0J3o0r4n3y0A4j0k1.0L0C4Y364M4$4a2w4(4s2,0=0}0L1r0k0k4;3y4M0E0b3v0r594`4K2}0=2g2i2t4^3b4)3Y0t0=0q4%5k4R040W4.4:5i065a5b4Q4|044E4G4I5i5z4Z1N5m045o5G5q4!040O533)4,5u5S3:4M0H585a5O1N4i040v1x1J5p4{5J4p042U5v2#5H3r5e2h2j0i165-5c0-5K0q5M5@5$3j4}2p50525i66014M575w5y5y6d4+041U0k0w2e140B0M6b655.615n5 5A5d044T4V4X6c6w6e0=5R6G60375`5g5}176L6A0-5Y5!6i5^3y5(0i4l5N6H6l4~6a6z5I615:5F6v6M6l6n6p4y0Y6t5W5P6g2#5x6X6i6k6O5|5~6%6M626,5_6m0B1I6o6q6`6u3_6H4M6K2%6(684 4A7i4b7k0=5Z6h716d5(0k0#7s2w6d6f6W715973045f756R6;6T0179777Q6?7d1J6^6r6{6S6-6I5Q6|1N0o1=04010z144T017)6U7v7H6j7o5C4F4H7O7j780=0N7?6N040B0c0c1|0l844M4O7#7b7M5h7n6M557H7z4S0X0S0L7 336Y5T7|5E8s3f184d0k2x2Y8C3|1r3~2A2C2y1Y1!2A7W8F0U3}0@8R0X0Z0#04.