Livraisons à Manhattan

Un livreur new-yorkais organise sa tournée. Le quartier dans lequel il évolue est un quadrillage : toutes les rues suivent l'axe Nord ↔ Sud ou l'axe Est ↔ Ouest.

Les adresses de ses livraisons sont donc des couples de coordonnées, (2, 3) par exemple. La première coordonnée est l'abscisse du point, la seconde son ordonnée.

Ces adresses de livraison sont données dans une liste python. Par exemple :

🐍 Script Python
livraisons = [(2, 0), (0, 1), (3, 3), (2, 3)]

Ce qui correspond à la carte ci-dessous :

La carte

Afin de déterminer son itinéraire, il décide de toujours livrer en priorité l'adresse la plus « proche » de sa position actuelle. Se déplaçant le long des rues, il mesure la distance \(AB\) entre deux points de coordonnées \((x_A\,; y_A)\) et \((x_B\,; y_B)\) en faisant :

\[AB = \text{abs}(x_B-x_A)+\text{abs}(y_B-y_A)\]

\(\text{abs}(x)\) est la valeur absolue du nombre \(x\) : \(\text{abs}(3-5)=\text{abs}(5-3)=2\).

Coup de pouce (1)

Avec Python, abs(x) renvoie la valeur absolue de x

Coup de pouce (2)

On rappelle que Python permet de récupérer facilement les différents valeurs d'un tuple grâce au décompactage (unpacking en anglais). Par exemple :

🐍 Console Python
>>> x, y = (3, 8)
>>> x
3
>>> y
8

On se propose dans cet exercice d'aider le livreur à déterminer son trajet en écrivant les deux fonctions décrites ci-dessous.

Fonction distance

Écrire la fonction distance qui prend en paramètres les coordonnées de deux points A et B donnés chacun sous la forme d'un tuple de deux entiers et qui calcule la distance entre ces deux points.

Exemples
>>> A = (0, 1)
>>> B = (2, 3)
>>> C = (1, 6)
>>> distance(A, B)
4
>>> distance(B, A)
4
>>> distance(A, C)
6
>>> distance(B, C)
4

###(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

.128013ua/(lbw)pgdo kehmf:+v,PA1SsinBytx4r-32c=050l0p0G0c0C0f0B0n0N0f0c0B0B0O010G0C0j010406050B0b0r0r0c0J0F040A0m0f0b0)0m0D050d0:0=0@0_0.0j041219051c0d1c1e190.0l0C0v0X0Z0#0%0q0C0k0q0f1s0q0G0,050S0g0f0p1n0!0$011r1t1v1t0G1B1D1z0G0g0m0l0_1A0J1a0G0q0X0|0B0j0c0D0%0M011F1p010s0U0p0D0c0r0p1z1%1)1.1H1;1D1@1_0,0a0n0x0J0m0j0m0B0C0 0D0n0Q1#0J0J0p0N2e121|0D1a0d1Z2r0G1X1W1Y0l1~0%1v0D1?2b1z1k1m0Y1G2B0C2D0D1T1l1z0j2k1a2p2r2V0/1(2f2J1/2O0J0?0f0,0z2o2Z0-2Y1}2#1H2%2)0,0M2-1)2/2p2A012@0c2*040L2{2q0.2~2=0%31330I362r2S0p2r2H2u0l2y2 0N1T1`1a3k1d2T2:2q3f053p0Q2U2Z2 0o0,0Q0s3y391o1H0h0,0n3J3D3a300s3G0C0B0S0D0N0p3Q2;3L0%0+040e3$2!3(300,0y3-2 3*0w3f3P3K2K3:040E3?3S3*0i0t3f060n483{3R3/0D0,0H3=132.3w3@0,3_4h2|4a3%3}4d040F4g2V4p3.3}0m0,0O3`4j3S4s4v2.47494E4c4e404n3x3|1/3^4D4R2?0,0F4O4w4L4z4B4U4b4r0,4Z4I494x3E0,2k0G0b0J114P044/4F0g0,0c0g0B413/3*3,4`4#2$4N4(4q1/4A040K5b4y59044f533}435h2 5e0u5p4}4 515m4S0,562X4V3b4X4,4o581H5e5g4`4|4M4t4H2|5H3)0,0i46123A3i1b3v0d3t2s3m122v2u1S1U2u501D3j1l2/5#0R0T0V04.
Fonction prochaine_livraison

Écrire la fonction prochaine_livraison qui prend en paramètres la liste des adresses de livraison et la position actuelle du livreur et renvoie les coordonnées du prochain point à livrer.

Si deux points sont à la même distance de la position actuelle du livreur on renverra les coordonnées du premier point rencontré dans la liste.

Une version valide de la fonction distance est chargée dans l'éditeur. Vous pouvez directement l'utiliser.

Fonctions, opérateurs ou modules interdits

Dans cet exercice on interdit d'utiliser :

  • min

  • sort

  • sorted

Exemples
>>> A = (0, 1)
>>> B = (2, 3)
>>> distance(A, B)
4
>>> livraisons_1 = [(2, 0), (0, 1), (3, 3), (2, 3)]
>>> prochaine_livraison(livraisons_1, (0, 0))
(0, 1)
>>> livraisons_2 = [(2, 0), (3, 3), (2, 3)]
>>> prochaine_livraison(livraisons_2, (0, 1))
(2, 0)
>>> livraisons_3 = [(3, 3), (2, 3)]
>>> prochaine_livraison(livraisons_3, (2, 0))
(2, 3)
>>> livraisons_4 = [(3, 3)]
>>> prochaine_livraison(livraisons_4, (2, 3))
(3, 3)
>>> livraisons_5 = [(1, 0), (0, 1)]
>>> prochaine_livraison(livraisons_5, (0, 0))
(1, 0)

###(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.339]uRéa;/q(lbCàwp8)g[do I7ekhmf:v,P1Ssin9L.y0_t54rF32cj6=050v0A0U0g0M0l0L0x0#0l0g0L0L0(010U0M0q010406050L0d0D0D0g0X0R040K0w0l0d0|0w0N0x020g0D0q0h0x0e0A160X0j0d0A0L050i13151719110q041x1E051H0i1H1J1E110v0M0G0;0?0^0`0C0M0t0C0l1X0C0U0 050,0m0l0A1S0@0_011W1Y1!1Y0U1*1,1(0U0m0w0v191)0X1F0U0C0;1c0L0q0g0N0`0!011.1U010E0.0A0N1k0A1(292b2g1:2j1,2m0D2o040a0x0I0X0w0q0w0L0M1f1h0*270X0X0A0#2J1x2q0N1F0i252V0U2322240v2s0`1!0N2l2G1(1P1R0=1/2)0M2+0N1 1Q1(0q2O1F2T2V30122a1h2;2h2_0X160l0 0x0J2S3410332r361:383a3c0!3f2b3h2T2(013m0g3b040x0Z3q2U113t3k0`3w3y0x0W3C3s343u3I3c0V3M3E3O3G3v0w393x3c0%3T3i351T3l3Y3n3z0z3%3F3*3H3,3!3z0r3:3V3=3X3Z3J0O3{3j3}3Q040J0S3M1G2~1x2/2Y0v2$3u0#1 2y0)1Q1F2}0A2 3g494i0*4q432=010B0 0*0E493;4x0p3c4D3|4x0N0E0 2}0w0#0C0-2+0T1!0G0X0-0L1g4I4w2h0~040k4#3)4K0 4V4X0M4Z0N1w1y4r4E4%0 0H3M0x3(3P4N2G2I0M1g0T0g2Q1u0l1,4+3u4(0s0F3T0x5j4 4`3l4N1d0L0T4O4Q0A4~503W0w0 0(5v5m3H4.1Q4:4=4@325C014(0u5d3W0D0M0 484^3r5w3}4(0c5i5k5W4-041P0L0,0N0#0A0T5Q0N0M3a5u5U2U5l4J2h5y045A5^3z5$374A4;5+5-5O5X0 4*60625n042F2H2J57590A5b5@5J5{1:4(4}605`4$6e0q5p5r2D5t684x5f5!5j6d0`4z040E3Y5B6p5D040M6N6v0`0w4G6Q0N6S4,370m0 4X0N0t6n4_6O5L6a6C2h5Q0 3e6c5K6r6Z3P6$042v6:6q6/6^6-0N5E4W4Y1g5I6,6T6.040s5g6F5k6G5K756f6A4R2@6{5x5z7q44765G79700`5M7y3v0 6R737c5Y7h7i6H7C5(652b5-6z4P7o6Y6t7K5}5 306u6!6e5)666+5V6_726o7c7l6g5456580U5a5c7F7!7z4|7t5%5s7S7B6E60067i7J5K6J0M4C7U7k645*7O5.7 4S7}5|0 020l0U0h8j7#7N5,5.5:5=3x7(2U7K4(5h83858E7Z516f6y7 8y615K7W8q6P8h7p8D8F86748d7%5/2@8w7^7Y7V7s8b8W7M8e8t7Q4Q8i8T7j6-6J2O7?0X7T8%8c8I0d5q8K3%0i4t4p4a960i4d1x0U4f9b2!2W1~202Y0g1+984d1D4v7`012O0D0T0E0g0B5.0C0Z0 1p1r1t1v0x8C321K3h1E0y0l0x0L000g0t2I0x2l0x0X0f3x2I0f0x0v000d2+9W2P0C0A0X5t9$1-8v0D140Q1G9K040P1-4/0A0d0X0x0qa00U274?2Z0d0M2O9O1g0x2Z0g0$0+9U1h0A0E0E2P7?2ba61Pan0f2O0N0U9F2O5t9/9-0:130#5-0^1Q1v9_9J9o0n0+ay9+aB9:2Lagaia60L1-9v9T9V4Q0w4;4;0Lar0x0o0;4R9E0x0f0,a40x0?a37n4S9~5F781ha`6x90a{7R1-2Lb2532J0x7=7@0A0Q0x0Y582ka-0x2x1_ac9V0b0d4W0A0H0;aP9=a?0C4j0x9*0t17ar9T2a0:a;a`0l1g0t1ua1af0w0,1,9$0daf4XaWad9Tb25p27a1ayaL1N4c0+0-0/04.