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)\]

où \(\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

.128013xA3Sytbi,)f4dug:khe sPar(lvow21/m+np=cB-050n0t0g0x0i0A0v0u0M0A0x0v0v0L010g0i0K010406050v0o0H0H0x0y0f040e0C0A0o0)0C0J050G0:0=0@0_0.0K041219051c0G1c1e190.0n0i0B0X0Z0#0%0s0i0p0s0A1s0s0g0,050S0h0A0t1n0!0$011r1t1v1t0g1B1D1z0g0h0C0n0_1A0y1a0g0s0X0|0v0K0x0J0%0E011F1p010l0U0t0J0x0H0t1z1%1)1.1H1;1D1@1_0,0a0u0w0y0C0K0C0v0i0 0J0u0Q1#0y0y0t0M2e121|0J1a0G1Z2r0g1X1W1Y0n1~0%1v0J1?2b1z1k1m0Y1G2B0i2D0J1T1l1z0K2k1a2p2r2V0/1(2f2J1/2O0y0?0A0,0F2o2Z0-2Y1}2#1H2%2)0,0E2-1)2/2p2A012@0x2*040d2{2q0.2~2=0%31330m362r2S0t2r2H2u0n2y2 0M1T1`1a3k1d2T2:2q3f053p0Q2U2Z2 0r0,0Q0l3y391o1H0D0,0u3J3D3a300l3G0i0v0S0J0M0t3Q2;3L0%0+040z3$2!3(300,0c3-2 3*0j3f3P3K2K3:040N3?3S3*0k0q3f060u483{3R3/0J0,0b3=132.3w3@0,3_4h2|4a3%3}4d040f4g2V4p3.3}0C0,0L3`4j3S4s4v2.47494E4c4e404n3x3|1/3^4D4R2?0,0f4O4w4L4z4B4U4b4r0,4Z4I494x3E0,2k0g0o0y114P044/4F0h0,0x0h0v413/3*3,4`4#2$4N4(4q1/4A040O5b4y59044f533}435h2 5e0I5p4}4 515m4S0,562X4V3b4X4,4o581H5e5g4`4|4M4t4H2|5H3)0,0k46123A3i1b3v0G3t2s3m122v2u1S1U2u501D3j1l2/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

.339.1280133Sytbi,IqF6)f4_d7ugj[:khe8 sPar(5].lRLàvow21/mCn0ép;=c9050r0A0f0F0h0L0D0C0%0L0F0D0D0$010f0h0!010406050D0t0V0V0F0G0e040d0Q0L0t0|0Q0X0C020F0V0!0#0C0M0A160G0k0t0A0D050U13151719110!041x1E051H0U1H1J1E110r0h0P0;0?0^0`0z0h0u0z0L1X0z0f0 050,0g0L0A1S0@0_011W1Y1!1Y0f1*1,1(0f0g0Q0r191)0G1F0f0z0;1c0D0!0F0X0`0S011.1U010o0.0A0X1k0A1(292b2g1:2j1,2m0V2o040b0C0E0G0Q0!0Q0D0h1f1h0*270G0G0A0%2J1x2q0X1F0U252V0f2322240r2s0`1!0X2l2G1(1P1R0=1/2)0h2+0X1 1Q1(0!2O1F2T2V30122a1h2;2h2_0G160L0 0C0T2S3410332r361:383a3c0S3f2b3h2T2(013m0F3b040C0c3q2U113t3k0`3w3y0C0p3C3s343u3I3c0I3M3E3O3G3v0Q393x3c0m3T3i351T3l3Y3n3z0s3%3F3*3H3,3!3z0B3:3V3=3X3Z3J0(3{3j3}3Q040T0Y3M1G2~1x2/2Y0r2$3u0%1 2y0)1Q1F2}0A2 3g494i0*4q432=010y0 0*0o493;4x0R3c4D3|4x0X0o0 2}0Q0%0z0-2+0q1!0P0G0-0D1g4I4w2h0~040H4#3)4K0 4V4X0h4Z0X1w1y4r4E4%0 0i3M0C3(3P4N2G2I0h1g0q0F2Q1u0L1,4+3u4(0n0x3T0C5j4 4`3l4N1d0D0q4O4Q0A4~503W0Q0 0$5v5m3H4.1Q4:4=4@325C014(0w5d3W0V0h0 484^3r5w3}4(0J5i5k5W4-041P0D0,0X0%0A0q5Q0X0h3a5u5U2U5l4J2h5y045A5^3z5$374A4;5+5-5O5X0 4*60625n042F2H2J57590A5b5@5J5{1:4(4}605`4$6e0!5p5r2D5t684x5f5!5j6d0`4z040o3Y5B6p5D040h6N6v0`0Q4G6Q0X6S4,370g0 4X0X0u6n4_6O5L6a6C2h5Q0 3e6c5K6r6Z3P6$042v6:6q6/6^6-0X5E4W4Y1g5I6,6T6.040n5g6F5k6G5K756f6A4R2@6{5x5z7q44765G79700`5M7y3v0 6R737c5Y7h7i6H7C5(652b5-6z4P7o6Y6t7K5}5 306u6!6e5)666+5V6_726o7c7l6g5456580f5a5c7F7!7z4|7t5%5s7S7B6E60067i7J5K6J0h4C7U7k645*7O5.7 4S7}5|0 020L0f0#8j7#7N5,5.5:5=3x7(2U7K4(5h83858E7Z516f6y7 8y615K7W8q6P8h7p8D8F86748d7%5/2@8w7^7Y7V7s8b8W7M8e8t7Q4Q8i8T7j6-6J2O7?0G7T8%8c8I0t5q8K3%0U4t4p4a960U4d1x0f4f9b2!2W1~202Y0F1+984d1D4v7`012O0V0q0o0F0y5.0z0c0 1p1r1t1v0C8C321K3h1E0j0L0C0D000F0u2I0C2l0C0G0Z3x2I0Z0C0r000t2+9W2P0z0A0G5t9$1-8v0V140K1G9K040N1-4/0A0t0G0C0!a00f274?2Z0t0h2O9O1g0C2Z0F0v0+9U1h0A0o0o2P7?2ba61Pan0Z2O0X0f9F2O5t9/9-0:130%5-0^1Q1v9_9J9o0W0+ay9+aB9:2Lagaia60D1-9v9T9V4Q0Q4;4;0Dar0C0O0;4R9E0C0Z0,a40C0?a37n4S9~5F781ha`6x90a{7R1-2Lb2532J0C7=7@0A0K0C0l582ka-0C2x1_ac9V0a0t4W0A0i0;aP9=a?0z4j0C9*0u17ar9T2a0:a;a`0L1g0u1ua1af0Q0,1,9$0taf4XaWad9Tb25p27a1ayaL1N4c0+0-0/04.