Dégradés de couleurs

Bob est webdesigner et triste. Il a l'habitude d'utiliser un outil en ligne pour créer de beaux dégradés de couleurs pour ses sites web :

image blender color

Mais aujourd'hui le site est hors-ligne... Nous allons aider Bob en écrivant une fonction qui génère le dégradé.

Une couleur est codée par un triplet \((r, v, b)\) qui représente dans l'ordre la quantité de rouge, de vert et de bleu. Chaque composante est un entier entre \(0\) et \(255\).

L'outil de Bob prend trois paramètres :

  • la couleur de départ couleur_1 ;

  • la couleur d'arrivée couleur_2 ;

  • le nombre nb de points intermédiaires strictement positif.

Le résultat est une liste ordonnée de couleurs [couleur_1, intermediaire_1, ..., intermediaire_nb, couleur_2] comportant nb + 2 tuples : la couleur de départ, les nb couleurs intermédiaires et la couleur d'arrivée.

Calcul des couleurs intermédiaires

Voilà, sur un exemple, comment calculer les couleurs intermédiaires, c'est-à-dire les valeurs intermédiaires de chacune des composantes. On se donne deux couleurs couleur_1 = (100, 200, 50) et couleur_2 = (150, 100, 100).

Supposons que l'on souhaite \(3\) couleurs intermédiaires. Pour la première composante, on doit passer de \(100\) à \(150\) sur \(4\) intervalles (en incluant la couleur d'arrivée). Il faut donc répartir \(50\) points en \(4\), par exemple \(50=13+ 13 + 12 + 12\).

La composante rouge de la couleur intermediaire_1 vaudra \(113 = 100 + 13\). Celle de la couleur intermediaire_2 vaudra \(126 = 113 + 13\). On procède de même pour les autres couleurs intermédiaires et pour les composantes verte et bleue.

On fournit une fonction repartir qui prend deux entiers en paramètres : a_diviser qui est la quantité à diviser équitablement (dans notre exemple \(50\)) et nb_parts en combien on doit couper la valeur a_diviser (\(4\) dans l'exemple).

🐍 Console Python
>>> repartir(50, 4)
[13, 13, 12, 12]
>>> repartir(1, 2)
[1, 0]
>>> repartir(0, 2)
[0, 0]

Cette fonction est déjà importée dans le fichier : vous pouvez directement l'utiliser. Pour information, voici son code :

🐍 Script Python
def repartir(a_diviser, nb_parts):
    quotient, reste = divmod(a_diviser, nb_parts)
    repartition = [quotient for _ in range(nb_parts)]
    for i in range(reste):
        repartition[i] += 1
    return repartition

On utilise la fonction divmod qui calcule et renvoie efficacement le quotient et le reste des deux entiers passés en argument.

Compléter la fonction degrade qui prend les mêmes trois paramètres dont l'outil de Bob a besoin et renvoie la liste des couleurs formant le dégradé comme expliqué ci-dessus.

Aides

Lorsqu'on a un triple mon_triplet, on peut utiliser le décompactage (unpacking en anglais) pour récupérer les 3 valeurs dans des variables, comme ceci : a, b, c = mon_triplet

Pour ajouter un tuple à la fin d'une liste on doit utiliser une double paire de parenthèses : ma_liste.append((x, y)).

Exemples
🐍 Console Python
>>> C1 = (150, 80, 120)
>>> C2 = (230, 20, 160)
>>> degrade(C1, C2, 3)
[(150, 80, 120), (170, 65, 130), (190, 50, 140), (210, 35, 150), (230, 20, 160)]

Dans cet exemple tous les intervalles de valeurs étaient divisibles par \(4\), donnant un dégradé parfaitement uniforme. Ce n'est pas forcément le cas, ce n'est pas grave : certains intervalles seront un peu plus grand que les autres c'est tout (un exemple où on divise par \(5\)) :

🐍 Console Python
>>> C3 = (10, 100, 220)
>>> C4 = (102, 200, 178)
>>> degrade(C3, C4, 4)
[(10, 100, 220), (29, 120, 212), (48, 140, 204), (66, 160, 196), (84, 180, 187), (102, 200, 178)]

Ici les deux premiers intervalles sont plus grands que les trois autres (de \(1\)).

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

.128013s3o_8bcdufvg/0ly n7apS.r1-me,(P2=4:+twki9][5h)6050i0C0L0u0O0p0b0r0h0p0u0b0b0H010L0O0v010406050b0j0B0B0u0y0q040w0d0p0j0:0d0s050n0`0|0~100^0v04191g051j0n1j1l1g0^0i0O0l0(0*0,0.0T0O0m0T0p1z0T0L0?050Z0g0p0C1u0+0-011y1A1C1A0L1I1K1G0L0g0d0i101H0y1h0L0T0(130b0v0u0s0.0G011M1w010k0#0C0s0u0B0C1G1.1:1^1O1{1K1~200?0a0r0F0y0d0v0d0b0O160s0r0X1,0y0y0C0h2l19230s1h0n1*2y0L1(1%1)0i250.1C0s1}2i1G1r1t0)1N2I0O2K0s1!1s1G0v2r1h2w2y2$0_1/2m2Q1_2V0y0}0p0?0r0z2v2*0@2)242,1O2.2:2=0G2^1:2`2w2H012 0u2;040r0c332x0^362}0.393b0r0I3f352*373l2=0S3p3h3r3j380d2/3a2=0V3w2{2+1v2~3B303c0t3G3i3J3k3L3D3c0f3P3y3R3A3C3m0P3X2|3Z3t040z0o3(3I2R3!3M0z2@1a2_3x3)3;3+0z323_343{3:2-3T3b0z3e413g3H3s460?0z3o4a2y2Z0C2y2O2B0i2F370h1!211h4n1k2!3H2%2_054s0X2#3Y3;0N0?0X0k3p4c3z0M2=4M3Q3}0k4J0C0m0y0u0X4R4G1_0=040E4#3|2-0?4s0j1K0j0y0e3^2(4S4%0?0D3p0r4N3*4.0d4:0C4=0e404_4$1O4(4}4i4 4`2~0?0s0g4+445b0?0U0J3w0r5s5f5a3k0?0y4^4B5g0.5c4~503}0?0l5z345F4{045d2$5u4,5h040g5J2x5Q5m0.0d0?0H5E5B385254565V0@5t5X3s5x585A5v015D5e5L5S0l5?5K5(5`5P5|5w5T5 5W64015!045$5{5(0s5*4;4?675.5t696g044s0B0v1K200s0L0b0e0y5%5^6b6d636f5x0C1/0y0:6z4i694(4*6M6F040y6k5:3z6b0A6A5R655y5l37622_6V51045j6Z5Y6a0?0K6/370B0O4f6%3z4(0U5r6m6R6q6s0C6u6w0e0l6@6W5#7a6,2r6I6K6|3Z6O7i5G045~7d3;6X7p4-7n5-6N4|7s5S6.6e6B6=7y0.6_6{6Q5^6~705s6n526r6t1}775k7B6!6;6c7E5)6S6H0~7h7I7V7k7(6:6o0g6U697r7U7,0?5U7l5M5O6*7N6-7T6E7C046?7=6^6`3,7_5n046 4i065/7}2r0`0p0Z0L7Y6C7Y4(0R88654/6i4@8q5_0?0Q7L6+4H0?0k3B7Y6o0O8l4P042T8F0g5x1:0m0C8v7*597V6o7A807V6b838Y6:7G877+6(5o5q8c5/8e6R6L8U6:6)348A7t798*6}7x843z7-8l7c907e0C8h8j8S0?8p8}6,8H9d3;4(8y8.8/7M6R0X8i0u6y937X957m737Q6v6x8=5@7)9b8v8G9a049j2$8d9l8`5S9o0Z789s6D7|720d7P757R6x8|8?8+049c9#910?9f9)7j8x8z8:5^6o9O9q7 9T819S8_7}9w9X9y0e9_607J9D9g7t9,9B8@9/9k9l8f974:99a71O6b0x9E0?0u0v0v1}0i9G0E6P9-7m9A9}5(8!8F4V9p9raj5C8 8$5;7n9s8#9`8VaE9P9!aa9$7{aA9=7@aNaD049@a29G0U8b9J9;7V4I7!0L4=189u7t8gah0u8k8c194D4l1i4y0n4w2z4p192C2B1Z1#2B0u1Jb0b31s2`b30Y0!0$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

.128013s3o_8bcdufvg/0ly n7apS.r1-me,(P2=4:+twki9][5h)6050i0C0L0u0O0p0b0r0h0p0u0b0b0H010L0O0v010406050b0j0B0B0u0y0q040w0d0p0j0:0d0s050n0`0|0~100^0v04191g051j0n1j1l1g0^0i0O0l0(0*0,0.0T0O0m0T0p1z0T0L0?050Z0g0p0C1u0+0-011y1A1C1A0L1I1K1G0L0g0d0i101H0y1h0L0T0(130b0v0u0s0.0G011M1w010k0#0C0s0u0B0C1G1.1:1^1O1{1K1~200?0a0r0F0y0d0v0d0b0O160s0r0X1,0y0y0C0h2l19230s1h0n1*2y0L1(1%1)0i250.1C0s1}2i1G1r1t0)1N2I0O2K0s1!1s1G0v2r1h2w2y2$0_1/2m2Q1_2V0y0}0p0?0r0z2v2*0@2)242,1O2.2:2=0G2^1:2`2w2H012 0u2;040r0c332x0^362}0.393b0r0I3f352*373l2=0S3p3h3r3j380d2/3a2=0V3w2{2+1v2~3B303c0t3G3i3J3k3L3D3c0f3P3y3R3A3C3m0P3X2|3Z3t040z0o3(3I2R3!3M0z2@1a2_3x3)3;3+0z323_343{3:2-3T3b0z3e413g3H3s460?0z3o4a2y2Z0C2y2O2B0i2F370h1!211h4n1k2!3H2%2_054s0X2#3Y3;0N0?0X0k3p4c3z0M2=4M3Q3}0k4J0C0m0y0u0X4R4G1_0=040E4#3|2-0?4s0j1K0j0y0e3^2(4S4%0?0D3p0r4N3*4.0d4:0C4=0e404_4$1O4(4}4i4 4`2~0?0s0g4+445b0?0U0J3w0r5s5f5a3k0?0y4^4B5g0.5c4~503}0?0l5z345F4{045d2$5u4,5h040g5J2x5Q5m0.0d0?0H5E5B385254565V0@5t5X3s5x585A5v015D5e5L5S0l5?5K5(5`5P5|5w5T5 5W64015!045$5{5(0s5*4;4?675.5t696g044s0B0v1K200s0L0b0e0y5%5^6b6d636f5x0C1/0y0:6z4i694(4*6M6F040y6k5:3z6b0A6A5R655y5l37622_6V51045j6Z5Y6a0?0K6/370B0O4f6%3z4(0U5r6m6R6q6s0C6u6w0e0l6@6W5#7a6,2r6I6K6|3Z6O7i5G045~7d3;6X7p4-7n5-6N4|7s5S6.6e6B6=7y0.6_6{6Q5^6~705s6n526r6t1}775k7B6!6;6c7E5)6S6H0~7h7I7V7k7(6:6o0g6U697r7U7,0?5U7l5M5O6*7N6-7T6E7C046?7=6^6`3,7_5n046 4i065/7}2r0`0p0Z0L7Y6C7Y4(0R88654/6i4@8q5_0?0Q7L6+4H0?0k3B7Y6o0O8l4P042T8F0g5x1:0m0C8v7*597V6o7A807V6b838Y6:7G877+6(5o5q8c5/8e6R6L8U6:6)348A7t798*6}7x843z7-8l7c907e0C8h8j8S0?8p8}6,8H9d3;4(8y8.8/7M6R0X8i0u6y937X957m737Q6v6x8=5@7)9b8v8G9a049j2$8d9l8`5S9o0Z789s6D7|720d7P757R6x8|8?8+049c9#910?9f9)7j8x8z8:5^6o9O9q7 9T819S8_7}9w9X9y0e9_607J9D9g7t9,9B8@9/9k9l8f974:99a71O6b0x9E0?0u0v0v1}0i9G0E6P9-7m9A9}5(8!8F4V9p9raj5C8 8$5;7n9s8#9`8VaE9P9!aa9$7{aA9=7@aNaD049@a29G0U8b9J9;7V4I7!0L4=189u7t8gah0u8k8c194D4l1i4y0n4w2z4p192C2B1Z1#2B0u1Jb0b31s2`b30Y0!0$04.