Différentes distances

Il existe en mathématiques et en informatique de nombreuses façons de calculer la distance entre deux points, cet exercice en étudie trois particulières.

Points A et B

Dans chaque question on étudie une distance différente. On demande à chaque fois d'écrire une fonction prenant en paramètres quatre nombres x_A, y_A, x_B et x_B correspondant aux coordonnées de deux points. Cette fonction renvoie la distance décrite.

assert ?

Le mot clé assert est utilisé en Python afin de vérifier que des propositions sont vraies.

Ainsi, l'instruction assert 3 + 5*7 == 38 permet de vérifier que l'expression 3 + 5*7 est bien évaluée à 38.

Si c'est le cas, le programme continue de se dérouler normalement. Dans le cas contraire, le programme est interrompu et une erreur est signalée.

La vidéo ne s'affiche pas... ?

Il peut arriver que les vidéos ne s'affichent pas sur des navigateurs basés sur Chrome, ou si un ad-blocker est activé sur le navaigateur. Essayer avec un autre navigateur si vous êtes dans ce cas (FireFox, typiquement), ou désactivez l'ad-blocker.

1. Distance de Manhattan

C'est la distance parcourue « en suivant les rues » dans le quartier de Manhattan. Elle vaut \(12\) dans la figure ci-dessous, quel que soit le chemin suivi :

Distance de Manhattan

On la définit comme la somme des « écarts » entre chaque paires de coordonnées des points :

\[\mathrm{manhattan}(x_A,\,y_A,\,x_B,\,y_B) = \lvert x_B - x_A \rvert + \lvert y_B - y_A \rvert\]
Valeur absolue ?

Avec Python, on calcule la valeur absolue de \(a\) en faisant abs(a).

Exemples

En prenant \(A(2\,;\,-5)\) et \(B(-3\,;\,1)\) :

>>> xA, yA = 2, -5
>>> xB, yB = -3, 1
>>> manhattan(xA, yA, xB, yB) 
11

En prenant \(A(2\,;\,2)\) et \(B(2\,;\,2)\) :

>>> xA, yA = 2, 2
>>> xB, yB = 2, 2
>>> manhattan(xA, yA, xB, yB)
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:pv(ui+2edxms=1 owlSAnatf-)Bh,crgyPkb/050k0j0y0x0g0t0n0q0F0t0x0n0n0o010y0g0c010406050n0f0m0m0x0G0I040u0r0t0f0%0r0w050M0.0:0=0@0,0c041017051a0M1a1c170,0k0g0d0V0X0Z0#0D0g0H0D0t1q0D0y0*050Q0L0t0j1l0Y0!011p1r1t1r0y1z1B1x0y0L0r0k0@1y0G180y0D0V0`0n0c0x0w0#0i011D1n010z0S0j0w0x0m0j1x1#1%1,1F1/1B1=1@0*0a0q0J0G0r0c0r0n0g0}0w0q0O1Z0G0G0j0F2c101`0w180M1X2p0y1V1U1W0k1|0#1t0w1;291x1i1k0W1E2z0g2B0w1R1j1x0c2i182n2p2T0-1$2d2H1-2M0G0;0t0*0p2m2X0+2W1{2Z1F2#2%0*0i2+1%2p2Q0j2p2F2s0k2w2y010F1R1^182 1b2R2.2o2_3d350O2S2X330K0*0O0z3e3i2/1m1F0s0*0q3p3c330w0z0*0;0w0D0x1L1%3x2n330)040e3J3j2:0#0w0*0l0v3P3r2I013M0E3p3w3K3R013T040I3W112,3y3*3#3%3=3s3S3U0C3X2Y3`3!0*3$3:2`3(3Q403,0I3}443d3)403M0B0b3p060q4l463Y1-3l042i0y0f0G0 4c044n3 3Z0w0L0*0x0L0n3~3L0*3O4x3_4B3|3^4e3Z0r0*0A4Q474O043V4I3?0*0B4W4o1F4T040h4)4A2!4D044F4H4M4R1-3M4L2V4`2;0*4a4/334,4V4x4z3z513/4~4X4{4%4j103g2}193b0M392q31102t2s1Q1S2s4F1B2~1j2-5m0P0R0T04.
2. Distance euclidienne

C'est la distance classique du cours de mathématiques (dans le cas où les axes sont perpendiculaires et de même échelle).

Distance euclidienne

On la calcule à l'aide du théorème de Pythagore :

\[\mathrm{euclidienne}(x_A,\,y_A,\,x_B,\,y_B) = \sqrt{(x_B - x_A)^2+(y_B - y_A)^2}\]

Afin de simplifier les calculs, on utilisera ici le carré de la distance euclidienne :

\[\mathrm{euclidienne\_carrée}(x_A,\,y_A,\,x_B,\,y_B) = (x_B - x_A)^2+(y_B - y_A)^2\]
Carré ?

Avec Python, on calcule le carré de \(a\) en faisant a**2.

Exemples

En prenant \(A(2\,;\,-5)\) et \(B(-3\,;\,1)\) :

>>> xA, yA = 2, -5
>>> xB, yB = -3, 1
>>> euclidienne_carre(xA, yA, xB, yB) 
61

En prenant \(A(2\,;\,2)\) et \(B(2\,;\,2)\) :

>>> xA, yA = 2, 2
>>> xB, yB = 2, 2
>>> euclidienne_carre(xA, yA, xB, yB)
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:pbv(i2+edxms= 1ow_lSAnatf-)Bh,crg*yPku/050k0j0z0y0g0u0n0p0G0u0y0n0n0o010z0g0c010406050n0N0m0m0y0H0K040v0r0u0N0)0r0x050O0:0=0@0_0.0c041219051c0O1c1e190.0k0g0e0X0Z0#0%0E0g0I0E0u1s0E0z0,050S0d0u0j1n0!0$011r1t1v1t0z1B1D1z0z0d0r0k0_1A0H1a0z0E0X0|0n0c0y0x0%0h011F1p010A0U0j0x0y0m0j1z1%1)1.1H1;1D1@1_0,0a0p0L0H0r0c0r0n0g0 0x0p0Q1#0H0H0j0G2e121|0x1a0O1Z2r0z1X1W1Y0k1~0%1v0x1?2b1z1k1m0Y1G2B0g2D0x1T1l1z0c2k1a2p2r2V0/1(2f2J1/2O0H0?0u0,0q2o2Z0-2Y1}2#1H2%2)0,0h2-1)2r2S0j2r2H2u0k2y2A010G1T1`1a311d2T2:2q2{3f370Q2U2Z350M0,0Q0A3g3k2;1o1H0s0,0p3r3e350x0A0,0j0N0Y0g1k1?2D0t0G0@2k3z2p350+040f3Q3l2=0%0x0,0l0w3W3t2K013T0F3r3y3R3Y013!040K3%132.3A3;3,3.3|3u3Z3#0D3(2!413+0,3-3`2|3/3X473?0K444b3f3:473T0C0b3r060p4s4d3)1/3n042k0z0N0H114j044u463*3T3V4E403*3?0l4i2V4G350r0,0B3 4l4N3#3_2X4Y1/4n454T0,0J0J4*3;0m0g2_4X4e3*4U040i4@4v1H4J4/4f0,4h4}4H1/4`4W4E4S3;4g4#3{4%4 0,0C514_4,4.4L5g0%4;4?4E0.0O3i2 1b3d0O3b2s33122v2u1S1U2u0y1C5x5A1l2/5A0R0T0V04.
3. Distance de Tchebytchev

Aux échecs, le roi peut se déplacer d'une case à la fois dans toutes les directions.

Combien de coups lui faut-il pour atteindre une case donnée ? La réponse est donnée par la distance de Tchebytchev.

Sur la figure ci-dessous, les cases marquées sont toutes accessibles en \(2\) coups.

Distance de Tchebytchev

Cette distance est égale à l'« écart » maximal entre les coordonnées de chaque point :

\[\mathrm{tchebytchev}(x_A,\,y_A,\,x_B,\,y_B) = \max (\lvert x_B - x_A \rvert ,\,\lvert y_B - y_A \rvert)\]
Maximum ?

Avec Python, on calcule le maximum de deux nombres a et b en faisant max(a, b).

Exemples

En prenant \(A(2\,;\,-5)\) et \(B(-3\,;\,1)\) :

>>> xA, yA = 2, -5
>>> xB, yB = -3, 1
>>> tchebychev(xA, yA, xB, yB)
6

En prenant \(A(2\,;\,2)\) et \(B(2\,;\,2)\) :

>>> xA, yA = 2, 2
>>> xB, yB = 2, 2
>>> tchebychev(xA, yA, xB, yB)
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:pv(ui2edxms=1 owlSAnatf-)Bh,crgyPkb/050j0i0x0w0g0s0m0p0E0s0w0m0m0n010x0g0c010406050m0f0l0l0w0F0H040t0q0s0f0$0q0v050L0-0/0;0?0+0c040 1605190L191b160+0j0g0d0U0W0Y0!0C0g0G0C0s1p0C0x0)050P0K0s0i1k0X0Z011o1q1s1q0x1y1A1w0x0K0q0j0?1x0F170x0C0U0_0m0c0w0v0!0h011C1m010y0R0i0v0w0l0i1w1!1$1+1E1.1A1;1?0)0a0p0I0F0q0c0q0m0g0|0v0p0N1Y0F0F0i0E2b0 1_0v170L1W2o0x1U1T1V0j1{0!1s0v1:281w1h1j0V1D2y0g2A0v1Q1i1w0c2h172m2o2S0,1#2c2G1,2L0F0:0s0)0o2l2W0*2V1`2Y1E2!2$0)0h2*1$2o2P0i2o2E2r0j2v2x010E1Q1@172~1a2Q2-2n2^3c340N2R2W320J0)0N0y3d3h2.1l1E0r0)0p3o3b320v0y0)0x0E0C0i0K0H3D0i0d3w2m320(040e3L3i2/0!0v0)0k0u3R3q2H013O0D3o3v3M3T013V040H3Y102+3x3,3%3)3@3r3U3W0B3Z2X3|3$0)3(3=2_3*3S423.0H3 463c3+423O0A0b3o060p4n483!1,3k042h0x0f0F0~4e044p413#0v0K0)0:0k403N0)3Q4z3{4D4F040w0K0m4J3^4L4V4a3~3`4g3#0q0)0z4#494D3W3;2U4$1,4i452S4B3y4Q4S4U4N4;1E3O4M4:4,2Z0)4c4+4q1E4(044*4z4_3,4b4/3?4 0!4i0A4l0 3f2|183a0L382p300 2s2r1P1R2r4S1A2}1i2,5u0O0Q0S04.