Aller au contenu

Listes en compréhension

I. Premiers tableaux en compréhension⚓︎

Un tableau peut s'initialiser avec des éléments par défaut de plusieurs manières.

En voici deux :

🐍 Script Python
>>> tableau = [0, 0, 0, 0]
>>> tableau = [0] * 4  

Le langage Python permet une autre manière pour créer des tableaux : il s'agit de la construction par compréhension.

Cela permet de créer des tableaux que nous n'aurions pas su créer avec la méthode précédente. Par exemple, comment créer le tableaux contenant les 1000 premiers carrés : 1, 4, 9, 16, 25 etc ? Nous allons étudier omment procéder dans ce cours.

Le code suivant permet également de créer un tableau de 4 éléments initialisés à 0. C'est une création de tableau par compréhension. on dit aussi que le tableau est écrit en compréhension

🐍 Script Python
>>> tableau = [0 for i in range(4)]
>>> tableau
[0, 0, 0, 0]
De la même façon, la boucle suivante :
🐍 Script Python
tableau = [0]*4
for i in range(4):
    tableau[i] = i
peut s'écrire :
🐍 Script Python
tableau = [i for i in range(4)]

Question
🐍 Script Python
tableau = [i for i in range(5, 15)]
  • tableau = [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
  • tableau = [i, i, i, i, i, i, i, i, i, i]
  • tableau = [0, 0, 0, 0, 0, 0, 0, 0, 0]
  • tableau = [5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
  • ❌ La valeur 15 est exclue.
  • ❌ i prend les valeurs de l'intervalle.
  • ❌ La valeur n'est pas contante.
  • ✅ i prend tour à tour les valeurs de 5 jusqu'à 14.
Question

Ecrire en compréhension la liste [5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5] qui contient 20 fois l'entier 5.

Puzzle

Question

Compléter le script ci-dessous :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
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 : 5/5

.65038.128013.98750ldy1,]k/weibmc_:3qaPr =o[f;tRg2sSh)(punv050f0n0F0w0o0e0J0z0r0e0w0J0J0A010F0o0O010406050J0P0q0q0w0y0g040K0B0e0P0,0B0Q0z020w0q0O0E0z0G0n0_0y0v0P0n0J050l0?0^0`0|0;0O04051r1k1u0l1r0;0f0o0R0!0$0(0*0L0o0H0L0e1I0L0F0/050V0p0e0n1D0%0)011H1J1L1J0F1R1T1P0F0y1s0F0L0!0 0J0O0w0Q0*0I011V1F010D0X0n0Q170n1P1=1@1|1X1 1T220q24040b0z0x0y0B0O0B0J0o12140T1:0y0y0n0r2p1k260Q1s0l1.2B1+1-1,1Q0f280*1L0Q212m1P1A1C0#1W2L0o2N0Q0B2R1P0O2u1s2z2B2)0=1?142T1}2Y0y0_0e0/0h2y2-0:2,272/1X2;2?0/0I2`1@2B2$0n2B2R2E0f1-2J2 0*0r2Z2e0S1B1s382(2{352A053i0T3p2~1E300/0r210F1j1l2{0z2}2.3y0*0B0/0A3r043H2z2K010.040C3P3I3T0q0o2^0d0d3P3R2-3T0k0/0D0B0y3*3Z3g010Q0/0k3?3S3^0B0m0/2W3}3,3^0Q0p0/0y1@0H0n3Y3~3K3U0/0N4e454g3#3%4k3x2U4h040M0j3P0;4f4r3`043C0o0n0y3E2)3+4q1}3M043O3F364I3J4r3V3X4O3s4y2:3{444J1X3.043:3=4V3Q3@4g4A3|4+4Q3T40420Q4!4R2:48044a0Q4c4p4{1X3V4j4+4-4r4n042_574X540/0i4`3!3$5b5c2+5e0*3V4u4w1k3u391v2%1k3b1k0F3d5A2H2C0w1S5v0l3b1q3w530*2u0q0s0D0w0k0n0s0L0u0/1c1e1g1i0z0t3Y1x2|0L0I0z0o0f5O1d0`5$5Z5?1f1h050w3T0L0n0w0T0y2M3.0z0L2u0D0*035P5@1h1{0,0F1T0*0x4E0_2X0F0z650/0c0a1k0w2B5-2|1r0x0%0z2r6d5{4d5+0;5J0U0W0Y04.
Solution
🐍 Script Python
# un tableau cents en compréhension qui contient 10 entiers 100.
cents = [100 for k in range(10)]

# un tableau entiers en compréhension qui contient les 10 entiers entre 1 et 10 compris.
entiers = [k for k in range(1, 11)]

On peut aussi utiliser des chaînes de caractères :

Testez

Exécuter le script ci-dessous :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
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

Question

Ecrire en compréhension : ['NSI-1', 'NSI-2', 'NSI-3', 'NSI-4', 'NSI-5', 'NSI-6', 'NSI-7', 'NSI-8', 'NSI-9', 'NSI-10']

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
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

Solution
🐍 Script Python
mon_tab = ["NSI-"+ str(i) for i in range(1, 11)]
print(mon_tab)

Quelques exemples⚓︎

Question

Compléter ci dessous le script : Ecrire en compréhension lst3 qui donne la liste de la somme des éléments de [2, 3, 1, 5] et de [4, 1, 7, 0] qui sont de même taille. On doit obtenir : [6, 4, 8, 5]

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
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

Solution
🐍 Script Python
lst1 = [2, 3, 1, 5]
lst2 = [4, 1, 7, 0]
lst3 = [lst1[p] + lst2[p] for p in range(len(lst1))]
print(lst3)
Question

Répondre sur papier.

Donner les listes lst1, lst2, lst4, lst6 et lst7

🐍 Script Python
lst1 = [3 for i in range(4)]
lst2 = [4-i for i in range(3)]
lst3 = [1, 2, 3]
lst4 = [lst3[i]**2 for i in range(len(lst3))]
lst5 = ["a","b","c"]
lst6 = [lst5[i]*2 for i in range(len(lst5))]
lst7 = [elem*2 for elem in lst5]
Solution
🐍 Script Python
lst1 = [3, 3, 3, 3]
lst2 = [4, 3, 2]
lst4 = [1, 4, 9]
lst6 = ['aa', 'bb', 'cc']
lst7 = ['aa', 'bb', 'cc']

II. Utilisation plus élaborée des tableaux en compréhension⚓︎

Grâce à la construction par compréhension, il est possible d'appliquer un traitement (opération, fonction...) à chaque élément d'un tableau.

Testez

Exécuter le script ci-dessous :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
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

Question
🐍 Script Python
double = [i * 2 for i in range(10)]
  • double = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  • double = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
  • double = [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
  • double = [4, 8, 12, 16]
  • ❌ Un traitement est appliqué aux valeurs prises par i.
  • ❌ Le mauvais traitement est appliqué.
  • ✅ le tableau est composé du double de chaque valeur de l'intervalle [0,9]
  • ❌ Le tableau double doit contenir autant d'éléments que le tableau d'origine.
Question

Compléter pour obtenir la liste dizaines = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

Puzzle

III. Appliquer un filtre⚓︎

La construction par compréhension permet d'appliquer un filtre à une structure de données de départ, afin de ne garder que certains éléments. On utilise pour cela une condition précédée du mot-clé if.

On peut ainsi créer un tableau qui ne conserve que les nombres pairs d'un tableau initial.

🐍 Script Python
>>> tableau = [0, 1, 6, 5, 4, 11, 12, 23, 26]
>>> pairs = [p for p in tableau if p%2 == 0]
>>> pairs
[0, 6, 4, 12, 26]
Question
🐍 Script Python
tableau = [i for i in range(5, 15)]
nouveau_tableau = [j for j in tableau if j < 10]
  • nouveau_tableau = [5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
  • nouveau_tableau = [5, 6, 7, 8, 9]
  • nouveau_tableau = [9, 8, 7, 6, 5]
  • nouveau_tableau = [10, 11, 12, 13, 14]
  • ❌ La condition entraine la sélection de certaines valeurs.
  • ✅ on sélectionne tous les éléments du tableau inférieurs à 10.
  • ❌ Les éléments conservent l'ordre dans lequel il se trouvent dans le tableau initial.
  • ❌ La condition indique les éléments qui sont conservés.
Question

Créer en compréhension la liste des carrés des nombres de la liste nombresqui sont négatifs.

Puzzle

Question

Compléter le script ci-dessous :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
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

Solution
🐍 Script Python
# un tableau positifs en compréhension qui contient 
# les nombres réels strictement positifs du tableau nombres
nombres = [1, 0, -2, 9, -5, 4, -7, 5, -8]
positifs = [k for k in nombres if k > 0]

# un tableau voyelle_phrase en compréhension qui ne contient que les voyelles 
# contenues dans la chaine de caractère phrase
phrase = "je ne suis pas sans voix !"
VOYELLES = "aeiouy"
voyelle_phrase = [caractere for caractere in phrase if caractere in VOYELLES]

IV. Les tableaux de tableaux⚓︎

Pour construire un tableau de tableaux de même longueurs, on peut utiliser des compréhensions imbriquées.

Dans les exemples qui suivent nous appelerons matrice notre tableau de tableaux.

🐍 Script Python
>>> matrice = [[k for k in range(4)] for j in range(3)]
>>> matrice
[[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]

Pour bien visualiser le tableau matrice que nous venons de créer, nous pouvons l'écrire de la façon suivante :

🐍 Script Python
    matrice = [ [0, 1, 2, 3],
                [0, 1, 2, 3],
                [0, 1, 2, 3] ]         
👉 Chaque élément de matrice correspond donc à une "ligne".

On peut considérer que matrice a quatre "colonnes". Par exemple la première colonne (de rang 0) est [0, 0, 0], et la dernière est [3, 3, 3].

💡 Il est possible d'extraire une ligne de matrice.

🐍 Script Python
>>> ligne_0 = matrice[0]
>>> ligne_0
[0, 1, 2, 3]

💡 Il est possible d'extraire une colonne de matrice.

🐍 Script Python
>>> colonne_2 = [ligne[2] for ligne in matrice]
>>> colonne_2
[2, 2, 2]
Question
🐍 Script Python
matrice = [[j for i in range(4)] for j in range(4)]
  • matrice = [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]]
  • matrice = [[0, 0, 0, 0], [1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]]
  • matrice = [[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]
  • matrice = [0, 1, 2, 3]
  • ❌ La valeur j est constante pour chaque ligne.
  • ✅ La valeur j prend la valeur 0 pour la première ligne, puis 1, etc.
  • ❌ La valeur j est constante pour chaque ligne.
  • ❌ Les constructions imbriquées engendrent un tableau de tableaux.
Question

Créer en compréhension la matrice [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

Puzzle

Question

Compléter le script ci-dessous :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
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

Solution
🐍 Script Python
# un tableau matrice_carre_10 en compréhension, matrice 10x10
# dont chaque ligne contient les entiers de 1 à 10.
matrice_carre_10 = [[k for k in range(1, 11)] for j in range(10)]

# un tableau ligne_5 en compréhension qui contient la colonne 5 (située à l'indice 4)
# de la matrice matrice_carre_10
colonne_5 = [ligne[4] for ligne in matrice_carre_10]

# un tableau diagonale en compréhension qui contient la colonne 1ère colonne de la 1ère ligne,
# la 2ème colonne de la 2ème ligne.... de la matrice carrée matrice_carre_10
diagonale = [matrice_carre_10[i][i] for i in range(len(matrice_carre_10))]
Question

Compléter le script ci-dessous :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
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 : 2/2

.128073.128161.128013.65038.9875y1-ê]/wi_qPr 79f;gR2àh)(EOpn0ld,4Akéebmc:35a=o[.8t6sSuxv050J0P0$0W0m0I0(0r0S0I0W0(0(0X010$0m0F010406050(0*0R0R0W0q0f040)0Y0I0*100Y0G0r020W0R0F0v0r0x0P1a0q0o0*0P0(050k17191b1d150F04051I1B1L0k1I150J0m0,0^0`0|0~0A0m0w0A0I1Z0A0$13050:0Q0I0P1U0{0}011Y1!1$1!0$1,1.1*0$0q1J0$0A0^1g0(0F0W0G0~0y011:1W010u0=0P0G1o0P1*26282d1=2g1.2j0R2l040c0r0p0q0Y0F0Y0(0m1j1l0.240q0q0P0S2G1B2n0G1J0k222S1 21201+0J2p0~1$0G2i2D1*1R1T0_1;2$0m2(0G0Y2,1*0F2L1J2Q2S2}16271l2.2e2?0q1a0I130r0g2P3114302o331=3537390y3c283e2Q2#013j0W38040r0U3n2R153q3h0~3t3v0r0L3z3p313r3F390V3J3B3L3D3s0Y363u390%3Q3f321V3i3V3k3w0s3!3C3%3E3)3X3w0#3-3S3/3U3W3G0t3^3g3`3N040g0H3 3$2/3{3*0g3b1C3d3R4048420g3m4d3o4f47343;3v0g3y4l3A3#3M4q130g3I4u3K4g4p3|4z3P4C1M2{1B2,2V0J212!3T0S2@2v0-1S1J2`0P2|3d3J054T0.4#4E1=0N130.0u3J0r4w3T0G0u130w0/0n1R0W0w0n4k2 3.4812040C4%5534130?0$5a3_56130B4=4@3`0Y130h020w0$0v5l5b3i0Q5d0m0(5f4C4?5w0~570T463r0l390r5N5g4,0~0(0J13021x0Y5t5V0*5X0v5Z5#5J3T5S5M5N0D0G1 0O1/0T0r5e0r5?0*2(5@5A0$1/2I1$5B1z0r2I0R0i2u0@0I1k0w1y0*0q1A4C4n3r5+3w5N0r1f0q105=650m50525_0r5{1/625 651k0$5@640O0I0O2u5/0@0(6E6G0@6I6K2i0$0@610W0r0y1u606u0w1k3u1/5)3`6l6n0r0C0J02030U0t0v2i0r0A0W1i5N0J2A2F1/0z0r6{0Q0{0r750w6~0S0A0P5k6i5m486.6n5r5Y5s5$7p0r0R0r0X0r0Z7w0g0K3x7A0L0j0K6,7k5T6m6/7K6n0Z0V0r0K0%7P0#7E7G2e7l7L7L0Z0y7A7z3x0j0r0j7V1=7X1m7p7n7q5t0r4|0$4~6%520C0R7h2}6j5*7I6/0Z0L7A0%7A0y7+6i816-837m5W5Y8h5$8j3Q066/7j5c042;1R0S0P0n1a0+5v5h2e5o040X8z5Q3s5y042s5P4o1=57594J5F3s5d5B8L3r577 3d5E8A1=8C0h8F8M0~0R0m4z3Q8o8R4.042L0$6f0G8)8W130Z8V4^8T5C548#5G8}8 41130m975i040j8~8Q948S8r0G8t8v8x9b8B5p9o3i999r959d8{3T8=0u3V9x988r9C480Y5L9j9F348I0q284|9u018O9Q0G8I8K9g8G9S9X8*9i5e9Q8X0B8b801B4)4!4K9/0k4N1B0$4P9@2Y2T0W1-9;4N1H4+9#2L0R0n0u0W0N8v0A0U131t1v1x645I4J1O3e0A0y0r0m0J0~a41bag0(ad1uat1y1A6Y3T7f0W0.0q2%4.6|2L0u0~03as1waz2c100$1.0~0p0P3W2=6FaH130e0d1B0W2Sam3e1I0b0r0E1l0F0P6 6~0|0m6y1062aX6G0ra72F0ragb0aF0G0ma 6S6L6F0J006z5}63765B65008s0m8u0r0h7%0I000W0,28bdaXb8a bebnbp0han0/0S0!1Ma-040a0r0M1i2L0r0q0O2C0G0(1/2Ca`9~6xbK1Q1S3r1@1#1%1)a23r2r2i2k132x0)0S0q116F0p0f221k4%4Za22~4$9.b/9y4/0P4;5D8p3i4`047^7`6v534$8R9Z938G0G919(5j9K8$5p7;cv3E9V5~cz9R13ai9,8R9I8o9!6k7I5%8i5!cP5(7i8R7.5.5:6s5^5`5|6B606A5~646668646b0G6da@6gbJcT9h7.6p6r6x4 51anc!c(bi0J6P1.6R6Jbc6Nd46Hd76U6W6A6Y6!2u6t506)1.4?c@8G7.6;6?6^6`1l6}6 65726C7577797b7d7f8Y4mce5R8f5N7;dN7r7t7v7x0Z7%0U7C7Udo9#7.7Y7M7O7Q7SdXcHc^dLd#7M7#3a7A0U7)9+4edJ017.dO7o7?cic}7|7~7,dK5,7w860r886Zd^4m8d7He6cO8kcQeicS808n6nd`8=8@8_cD579fcp9#cr8J8UcL3Teu9T9teB3`579e9Q8%9Q8,8.eG9G9qeP8q9aeS8N13ec2R8!8G9z9Bcd8ReyeU2}e!9#9H998`e(9h9U139Nc/0Pct589T9V2ie|8Pew3McseV9v0B9*3!0kc79:2Sa04M0/0;0?04.

V. Exercice⚓︎

π à Monte-Carlo

La méthode de Monte-Carlo est un ensemble de méthodes algorithmiques visant à déterminer la valeur approchée d'une constante en utilisant des procédés aléatoires.

On peut utiliser cette méthode afin de déterminer une valeur approchée de \(\pi\). L'idée est la suivante :

  • on considère un carré de \(2\) unités de côtés. Son aire vaut donc \(4\) ;
  • on considère un disque de rayon \(1\) centré au centre du carré. Son aire vaut donc \(\pi \times 1^2=\pi\) ;
  • on génère un grand nombre de points aléatoires répartis de façon uniforme dans le carré.

Il reste alors à compter le nombre de points à l'intérieur du disque. On peut montrer que leur fréquence tend vers \(\frac{\pi}{4}\) quand le nombre de points aléatoires devient très grand.

Une valeur approchée de \(\pi\) est donc :

\[\pi \approx 4 \times \frac{\text{nombre de points dans le disque}}{\text{nombre de points dans le carré}}\]

On observe ci-dessous le carré de départ ainsi que de nombreux points. On a représenté de couleur différente ceux qui sont dans le cercle et ceux qui n'y sont pas.

Méthode de Monte-Carlo

On se donne donc :

  • une liste de nb_points aléatoires, tous dans le carré décrit ci-dessus. Cette liste est nommée points et chaque point est représenté par ses coordonnées. Par exemple [(-0.5313, 0.0936), (0.9638, 0.3577), ...].

  • une fonction distance_origine prenant en argument les coordonnées x et y d'un point et renvoyant sa distance à l'origine du repère (et donc au centre du cercle)

On demande d'extraire la liste des points situés dans le cercle à l'aide d'une liste en compréhension.

La fonction random

Le module random de Python propose une fonction random qui génère des nombres aléatoires uniformément répartis entre 0 et 1.

👉 On a donc 2 * random() qui est compris entre 0 et 2

👉 On en déduit que 2 * random() - 1 est compris entre -1 et 1.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
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

Solution

Pour ne pas surcharger le site, nous avons choisi ici nb_points = 1000. Chez vous, sur votre prpre éditeur Python, vous pouvez tester avec nb_points = 100_000, pour obtenir une meilleure précision.

🐍 Script Python
from math import sqrt
from random import random

nb_points = 1000
points = [(2 * random() - 1, 2 * random() - 1) for _ in range(nb_points)]


def distance_origine(x, y):
    return sqrt(x * x + y * y)


proches = [p for p in points if distance_origine(p[0], p[1]) <= 1]
approximation = 4 * len(proches) / nb_points

print("Pi est environ égal à : ", approximation)

VI Crédits⚓︎

Pierre Marquestaut, Nicolas Revéret et Mireille Coilhac