Chapitre 1 : Les tuples et les tableaux en Python


Introduction : types construits

Vous avez jusqu'à présent utilisé des types de base (types int, float, boolean, str). Ce type de données ne peut contenir qu'une seule valeur, ce qui devient très vite limité lorsque l'on manipule des données plus complexes (des fichiers, des images, des sons,...) qui sont formées de plusieurs (centaines, milliers, millions de) valeurs.

Heureusement, à partir de ces types de base se constituent des types construits. Dans cette séquence, vous allez découvrir trois de ces types construits : les p-uplets, les tableaux (chapitre 1, donc dans ce document) et les dictionnaires (chapitre 3). Ces types permettent de structurer l'information disponible et d'améliorer la lisibilité des programmes si on les utilise pour nommer correctement la nature des informations enregistrées.

I. Les tuples ou p-uplets

Les tuples sont des séquences qui permettent de regrouper plusieurs informations sous un seul nom et ainsi de faire abstraction de la représentation.

Les termes tuple ou p-uplet sont utilisés indifféremment pour désigner cette généralisation du couple, triplet, quadruplet ...

Pour définir un tuple, on utilise des parenthèses comme ci-dessous.

In [10]:
coord = (2, -3)
print(type(coord))
<class 'tuple'>

On peut facilement accéder aux différents élements d'un tuple en utilisant des crochets et l'index de l'élément (n'oubliez pas que le premier élément est celui d'index 0).

In [11]:
print(coord[0])
print(coord[1])
2
-3

Exercice 1 :

Voici un tuple de trois valeurs : un nom, un prénom et un numéro de téléphone. Quelles instructions permettent d'accéder à ces trois valeurs ?

In [15]:
individu = ("Richard", "Baptiste", "0611111111")
# à compléter

Exercice 2 :

La couleur d'un pixel d'une image est définie par un triplet RVB (Rouge, Vert, Bleu). La nuance de gris de ce pixel est, par exemple, la moyenne entière des trois valeurs du triplet RVB. Complétez le programme ci-dessous pour qu'il affiche la nuance de gris du pixel.

In [14]:
couleur_pixel = (155, 220, 67)
# à compléter

Exercice 3 :

Les points sont définis dans un plan par un couple de coordonnées (abscisse, ordonnée). On veut écrire une fonction qui prend en paramètres deux tuples A et B (correspondant aux coordonnées de deux points $A$ et $B$) et qui renvoie les coordonnées du milieu du segment [AB].
Rappel : si $A(x_A;y_A)$ et $B(x_B;y_B)$ sont les coordonnées des points $A$ et $B$ alors le milieu du segment $[AB]$ a pour coordonnées $\left(\frac{x_A+x_B}{2};\frac{y_A+y_B}{2}\right)$.

In [ ]:
def milieu(A, B):
    # à compléter

# Test
C = (1, 2)
D = (5, 10)
milieu(C, D)

Remarques :

  • En Python, les tuples ne sont pas typés. Par exemple, au lieu d'indiquer : tuple(int, int), l'interprète indique seulement : tuple

  • Les tuples ne sont pas mutables, c'est-à-dire qu'on ne peut pas les modifier. On ne peut pas écrire : A[0] = 2 pour modifier un élément d'un tuple A.

  • Les tuples sont de taille statique : on peut pas ajouter une composante à un tuple existant.
  • Malgré la notation indicée, il ne faut pas les confondre avec les tableaux.

Les tuples permettent de simplifier l'écriture des programmes en faisant abstraction de détails.

Sans cette notion, la fonction milieu aurait 4 paramètres, et dans le programme qui l'utilise, il faudrait 2 fois plus de variables pour mémoriser les informations.

La seule précaution à prendre, est qu'il n'y ait pas d'ambiguité sur l'ordre dans lequel les informations sont rangées dans un tuple, sinon il faut en nommer les différentes parties.

II. Les tableaux (listes en Python)

Les tableaux, appelés listes en Python, sont des séquences (comme les tuples, comme les chaînes de caractères). Ce sont des objets qui peuvent contenir d'autres objets de n'importe quel type (et même de types différents) : des tableaux de nombres entiers, des tableaux de flottants, des tableaux de chaînes de caractères.

A. Tableaux indexés

Les tableaux (ou liste en Python) se déclarent des crochets.

In [10]:
tab1 = [1,5,10,20] # un tableau d'entiers
tab2 = [25.0,17.2,14.8,108.7,137.4] # un tableau de flottants
tab3 = ["Richard", "Baptiste", "0611111111"] # un tableau de chaînes de caractères
tab4 = [True, (10 < 12), ("alpha" >= "beta")] # un tableau de booléens
tab5 = [] # un tableau vide
tab6 = [0]*10 # un tableau de taille 10 composée uniquement d'entiers 0

1. Lire les éléments d'un tableau grâce à leur index

Les éléments d'une liste sont indicés, chaque élément a sa place. On accède à un élément d'une liste en utilisant les crochets :

In [11]:
print(tab1[2])
print(tab2[0])
print(type(tab3))
print(tab4)
print(tab5)
print(tab6)
10
25.0
<class 'list'>
[True, True, False]
[]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Exercice 4 :

  1. Quelle instruction permet d'afficher les nombres 5 et 20 de tab1 ?
In [ ]:
tab1 = [1,5,10,20] # un tableau d'entiers
# à compléter
  1. Quelle instruction permet d'afficher le numéro de téléphone de tab3 ?
In [ ]:
tab3 = ["Richard", "Baptiste", "0611111111"] # un tableau de chaînes de caractères
# à compléter
  1. Quelle instruction permet d'afficher les premier et troisième booléens de tab4 ?
In [ ]:
tab4 = [True, (10 < 12), ("alpha" >= "beta")] # un tableau de booléens
# à compléter
  1. Quelle instruction permet de créer un tableau de taille 100 composé uniquement de 1 ?
In [ ]:
# à compléter

2. Modifier les éléments d'un tableau grâce à leurs index

Les tableaux sont des types dits mutables : cela signifie que l'on peut remplacer un élément d'un tableau par un autre (ce qui n'était pas le cas pour les tuples ou les chaînes de caractères).

Exemple :

In [13]:
mon_tab = [1, 2, 3, 4, 5, 6, 7]
mon_tab[2] = 10 # l'élément d'index 2 vaut maintenant 10
print(mon_tab)
[1, 2, 10, 4, 5, 6, 7]

Exercice 5 :

Le nouveau numéro de téléphone de Baptiste est : 06 22 22 22 22. Quelle instruction permet de modifier le numéro de téléphone de Baptiste dans le tableau suivant ?

In [26]:
contact = ["Richard", "Baptiste", "0611111111"]
# à compléter

Remarque : il était impossible de faire cela avec un tuple !

Exercice 6 :

Complétez la fonction suivante pour qu'elle échange les valeurs d'index i et j du tableau tab.

In [ ]:
T = [3, 8, 12, 9, 56, 14, 22, 7, 13, 41]

def echange(tab,i,j):
    # ---------------
    # à compléter
    # ---------------

# Test
echange(T,2,4)
T

B. Taille d'un tableau

Très important : la taille d'un tableau est renvoyée par la fonction len. Il s'agit du nombre d'éléments du tableau.

In [2]:
tab = [0, 2, 3, 10]
print(len(tab))
T = ["Albert", "Grégory", "Justine", "Anaïs", "Myriam", "Pascal"]
print(len(T))
4
6

La taille d'un tableau permettra de parcourir les différents élements du tableau avec une boucle for ou while (voir plus loin) et deviendra très importante dans les calculs de coût des algorithmes.

C. Construire un tableau

Supposons que l'on veuille construire un tableau de taille 100 contenant l'entier $2\times i$ dans sa case d'index $i$. On peut bien sûr le construire de la manière suivante

In [10]:
t = [0, 2, 4, 6, 8, 10, 12, ...]

mais c'est extrêment fastidieux car il faudrait écrire les 100 valeurs. Il existe deux solutions pour construire ce tableau de manière plus rapide.

1. Construire un tableau avec une boucle for

La première façon est de créer au préalable un tableau de taille 100 avec une valeur arbitraire puis de le remplir ensuite avec une boucle for:

In [15]:
t = [0]*100 # création d'un tableau de taille 100 avec une valeur arbitraire (ici 0)
for i in range(100): # construction du tableau
    t[i] = 2*i
print(t)  # affichage du tableau
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198]

Comme c'est une construction qui revient souvent, Python propose une syntaxe plus compacte encore : une construction par compréhension.

2. Construire un tableau par compréhension

Pour construire le tableau précédent par compréhension, l'instruction suivante suffit :

In [18]:
t = [2*i for i in range(100)] # création et construction du tableau
print(t) # affichage du tableau
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198]

La fonction suivante crée un tableau de 100 valeurs, chacune étant générée par un appel à la fonction randint.

In [30]:
from random import randint 
Tableau = [randint(0,1000) for i in range(100)]
print(Tableau)
[672, 257, 760, 582, 788, 26, 8, 484, 577, 588, 784, 941, 927, 578, 845, 948, 582, 783, 545, 542, 391, 985, 562, 683, 111, 825, 228, 121, 803, 608, 592, 821, 617, 674, 160, 155, 574, 451, 112, 444, 4, 287, 462, 383, 295, 992, 20, 336, 791, 159, 969, 5, 48, 438, 310, 436, 146, 394, 385, 638, 303, 814, 696, 312, 740, 54, 432, 450, 18, 206, 978, 211, 886, 479, 15, 355, 581, 509, 183, 940, 739, 93, 841, 872, 771, 604, 791, 1, 225, 718, 563, 209, 557, 687, 276, 256, 58, 550, 954, 197]

Exercice 6 :

  1. En utilisant les deux méthodes, créez un tableau qui contient tous les entiers compris entre 0 et 1000.
In [20]:
# AVEC UNE BOUCLE
# ---------------
# à compléter
# ---------------

# PAR COMPREHENSION
# ---------------
# à compléter
# ---------------
  1. En utilisant les deux méthodes, créez un tableau qui contient tous les entiers compris entre 5 et 15.
In [21]:
# AVEC UNE BOUCLE
# ---------------
# à compléter
# ---------------

# PAR COMPREHENSION
# ---------------
# à compléter
# ---------------
  1. En utilisant les deux méthodes, créez un tableau qui contient tous les nombres pairs compris entre 0 et 50.
In [ ]:
# AVEC UNE BOUCLE
# ---------------
# à compléter
# ---------------

# PAR COMPREHENSION
# ---------------
# à compléter
# ---------------
  1. En utilisant les deux méthodes, créez un tableau qui contient les carrés de tous les entiers compris entre 1 et 100 (c'est-à-dire 1, 4, 9, 16, etc.)
In [ ]:
# AVEC UNE BOUCLE
# ---------------
# à compléter
# ---------------

# PAR COMPREHENSION
# ---------------
# à compléter
# ---------------
  1. En utilisant les deux méthodes, créez un tableau de taille 200 contenant des entiers aléatoires compris entre 0 et 10. Pour rappel la fonction randint de la bibliothèque random permet de renvoyer des entiers de manière aléatoire. Exécutez ensuite plusieurs fois le code.
In [ ]:
# AVEC UNE BOUCLE
# ---------------
# à compléter
# ---------------

# PAR COMPREHENSION
# ---------------
# à compléter
# ---------------

D. Ajouter un élément à un tableau Python : la méthode append

Il est possible d'ajouter un élément à un tableau Python car les tableaux sont définis par le type list en Python, ce qui n'est pas le cas pour les tableaux dans d'autres langages de programmation.

Quoiqu'il en soit, ajouter un élément à un tableau est très utile, notamment dans le traitement de données en tables (voir Séquence 3, Chapitre 4) pour mémoriser les éléments d'un fichier dans une table (= tableau).

La méthode append() permet d'ajouter un élément en fin de tableau.

In [7]:
t1 = [2, 5, 10, -4, 1]
t1.append(8)
t2 = ["Alphonse", "Barbara", "Charline"]
t2.append("Clara")
print(t1)
print(t2)
[2, 5, 10, -4, 1, 8]
['Alphonse', 'Barbara', 'Charline', 'Clara']

On peut aussi construire un tableau en utilisant cette méthode, en partant d'un tableau vide :

In [4]:
t = []
for i in range(10):
    t.append(i*i) # à chaque tour de boucle, l'élément i*i est ajouté en fin de tableau
    print(t)      # affichage pour voir l'évolution du tableau à chaque tour de boucle (optionnel)
t
[0]
[0, 1]
[0, 1, 4]
[0, 1, 4, 9]
[0, 1, 4, 9, 16]
[0, 1, 4, 9, 16, 25]
[0, 1, 4, 9, 16, 25, 36]
[0, 1, 4, 9, 16, 25, 36, 49]
[0, 1, 4, 9, 16, 25, 36, 49, 64]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Out[4]:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Cela reste tout de même plus long qu'une construction par compréhension

In [5]:
t = [i*i for i in range(10)]
t
Out[5]:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

III. Tableaux de tableaux

Un tableau peut aussi contenir des ... tableaux. Chaque élément du tableau est alors lui-même un tableau, c'est pourquoi on parle d'un tableau de tableaux.

Exemple :

In [1]:
contacts = [['Baptiste', '0611111111'], ['Grégory', '0622222222'],
 ['Fabien', '0633333333'], ['Regis', '06444444444'],
 ['Mélinda', '0655555555'], ['Rachel', '0666666666'],
 ['Elise', '0677777777'], ['Janine', '0688888888']]

A) Accès aux éléments

On peut alors accéder à chaque élément du tableau grâce à son index, mais aussi à chaque élément de chaque sous-tableau comme le montre les instructions ci-dessous :

In [5]:
print(contacts[1])
print(contacts[1][0])
print(contacts[1][1])

print(contacts[6])
print(contacts[6][0])
print(contacts[6][1])

print(len(contacts))  # taille du tableau 'contacts'
print(len(contacts[1])) # taille du deuxième élément du tableau 'contacts' (qui est lui-même un tableau)
['Grégory', '0622222222']
Grégory
0622222222
['Elise', '0677777777']
Elise
0677777777
8
2

Exercice 7 :

Voici les premières notes de l'année obtenues par un élève en NSI :

Note coefficient
15 1
13 2
8 1
18 1
  1. Ces notes et coefficients sont d'abord stockées dans deux tableaux comme ci-dessous. Quelle instruction permet d'accéder la troisième note ? Quelle instruction permet d'accéder au coefficient de la deuxième note ?
In [33]:
notes = [15, 13, 8, 18]
coeff = [1, 2, 1, 1]
# ---------------
# à compléter
# ---------------
  1. Ces notes et coefficient sont maintenant stockées dans un tableau de tableaux. Quelle instruction permet d'accéder à la troisième paire note-coefficient ? Quelle instruction permet d'accéder la troisième note ? Quelle instruction permet d'accéder au coefficient de la deuxième note ?
In [35]:
notes_coeff = [[15, 1], [13, 2], [8, 1], [18, 1]]
# ---------------
# à compléter
# ---------------

B) Construction d'un tableau à deux dimensions

Pour construire un tableau de tableaux, il est très avantageux de le construire par compréhension.

In [31]:
tab1 = [[1, 2, 3] for i in range(4)]
tab1
Out[31]:
[[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]
In [2]:
tab2 = [[i*j for j in range(3)] for i in range(5)]
tab2
Out[2]:
[[0, 0, 0], [0, 1, 2], [0, 2, 4], [0, 3, 6], [0, 4, 8]]

Exercice 8

Ecrire un programme qui construit par compréhension un tableau t de taille 5 $\times$ 5, tel que t[i][j] contient $i+j$.

In [ ]:
# à compléter

IV. Itérer sur les éléments d'un tableau

A. Parcours d'un tableau

Lorsque l'on veut répéter une opération pour chaque élément e d'un tableau t, il est possible d'utiliser l'instruction for directement sur le tableau lui-même, de la manière suivante :

In [19]:
t = [15, 13, 8, 18]
for e in t:
    print(e)
15
13
8
18

Dans un telle forme, la boucle énumère les éléments du tableau : elle effectue un tour de boucle pour élément de t et l'élément inspecté à un tour donné est associé à la variable e. Le programme précédent est équivalent à cet autre programme

In [20]:
t = [15, 13, 8, 18]
for i in range(len(t)):
    e = t[i]
    print(e)
15
13
8
18

dans lequel la boucle énumère les indices i du tableau t, les éléments correspondants étant récupérés via l'expression t[i].

B. Parcours d'un tableau à plusieurs dimensions

Pour parcourir les éléments d'un tableau à plusieurs dimensions, on va naturellement utiliser des boucles imbriquées, chaque boucle parcourant une dimension. On peut parcourir le tableau en énumérant les indices

In [ ]:
t = [[1,2,4],[5,6,1],[1,0,3],[4,5,3],[8,1,0]]
for i in range(5):
    for j in range(3):
        print(t[i][j])

ou en énumérant les éléments du tableau

In [ ]:
t = [[1,2,4],[5,6,1],[1,0,3],[4,5,3],[8,1,0]]
for l in t:        # pour chaque élément l de t  (pour chaque sous-tableau l de t)
    for x in l:    # pour chaque élément x de l  (pour chaque élement x du sous-tableau l)
        print(x)

Exercice 9

Ecrire un programme qui permet de calculer la somme des éléments du tableau t donné ci-dessous.

In [ ]:
t = [[1,2,4],[5,6,1],[1,0,3],[4,5,3],[8,1,0]]
# ---------------
# à compléter
# ---------------

Exercice 10 : Un exercice un peu plus appliqué

Une image est constituée de pixels, chaque pixel étant défini par un tuple (R,V,B) (nuances de rouge, vert et bleu). Il est possible de stocker la série de pixels d'une image dans un tableau (=liste Python) grâce aux instructions suivantes :

In [6]:
from PIL import Image # on importe le module Image de la bibliothèque PIL
img = Image.open("perroquet.jpg")  # on ouvre l'image perroquet.jpg qui doit être placée dans le même repertoire que ce notebook
pixels = list(img.getdata())      # on récupère les données de l'image que l'on converti en une liste et que l'on stocke dans le tableau 'pixels'
display(img)  # pour afficher l'image

print(pixels) # pour afficher le tableau 'pixels' contenant tous les pixels de l'image
print("le 4ème pixel est : ", pixels[3]) # pour afficher le 4ème pixel du tableau
print("la composante Rouge du 4ème pixel est : ",pixels[3][0]) # pour afficher les composantes R, V et B du 4ème pixel
print("la composante Verte du 4ème pixel est : ",pixels[3][1])
print("la composante Bleue du 4ème pixel est : ",pixels[3][2])
img.close() # on ferme le flux
[(100, 113, 83), (95, 123, 108), (97, 137, 137), (117, 144, 161), (147, 155, 176), (165, 168, 187), (172, 184, 198), (166, 183, 190), (150, 159, 156), (124, 122, 107), (82, 77, 58), (78, 78, 66), (100, 105, 101), (116, 121, 114), (128, 134, 108), (130, 137, 95), (136, 127, 110), (131, 124, 98), (132, 125, 97), (129, 121, 100), (115, 107, 96), (105, 98, 90), (98, 93, 87), (87, 85, 88), (78, 80, 93), (86, 93, 112), (94, 110, 123), (99, 122, 128), (96, 127, 132), (86, 124, 127), (75, 118, 109), (64, 112, 90), (76, 104, 79), (87, 109, 70), (99, 117, 59), (110, 120, 57), (112, 121, 64), (110, 122, 74), (108, 122, 86), (110, 123, 95), (108, 121, 103), (110, 125, 118), (99, 120, 123), (87, 115, 119), (82, 112, 114), (76, 98, 95), (75, 87, 83), (86, 91, 87), (88, 125, 152), (111, 148, 175), (93, 106, 80), (92, 115, 99), (97, 126, 124), (111, 136, 143), (137, 151, 162), (160, 166, 182), (176, 183, 201), (171, 185, 198), (151, 169, 171), (120, 131, 123), (81, 83, 72), (85, 83, 70), (113, 112, 94), (131, 129, 108), (145, 139, 117), (149, 136, 119), (142, 140, 125), (134, 132, 117), (128, 126, 113), (122, 119, 110), (113, 110, 105), (104, 103, 101), (97, 97, 95), (90, 92, 91), (84, 90, 90), (88, 98, 99), (95, 109, 112), (100, 118, 122), (97, 121, 125), (91, 117, 116), (80, 111, 105), (76, 108, 97), (80, 107, 74), (88, 111, 65), (101, 116, 57), (110, 122, 58), (113, 122, 65), (110, 122, 76), (107, 121, 86), (105, 121, 95), (106, 122, 109), (108, 128, 127), (99, 123, 133), (85, 113, 124), (78, 107, 111), (74, 96, 94), (77, 88, 84), (91, 93, 88), (87, 121, 146), (110, 144, 171), (95, 107, 85), (100, 114, 101), (107, 124, 118), (116, 135, 133), (135, 153, 153), (157, 169, 181), (176, 187, 209), (172, 188, 213), (150, 172, 186), (117, 136, 140), (81, 92, 86), (89, 93, 76), (122, 122, 96), (143, 139, 112), (155, 143, 131), (158, 139, 143), (140, 144, 129), (133, 136, 125), (124, 127, 120), (117, 120, 113), (110, 115, 108), (105, 110, 104), (102, 107, 103), (100, 107, 100), (96, 106, 95), (95, 105, 94), (97, 108, 100), (102, 114, 110), (100, 115, 110), (93, 109, 99), (87, 105, 93), (87, 105, 93), (86, 111, 69), (91, 114, 60), (102, 118, 55), (111, 123, 57), (113, 124, 68), (111, 124, 81), (107, 124, 92), (103, 124, 105), (111, 134, 128), (113, 140, 149), (104, 132, 153), (87, 118, 138), (76, 104, 115), (72, 92, 93), (80, 89, 86), (97, 98, 93), (91, 119, 141), (114, 142, 166), (106, 114, 101), (107, 119, 107), (115, 131, 118), (129, 145, 134), (147, 164, 158), (158, 177, 184), (171, 191, 215), (172, 192, 225), (153, 172, 202), (119, 137, 151), (80, 97, 89), (84, 99, 78), (115, 125, 101), (134, 138, 123), (142, 141, 137), (144, 139, 143), (144, 146, 133), (141, 143, 130), (132, 134, 120), (122, 126, 109), (114, 119, 99), (106, 113, 97), (104, 110, 98), (105, 113, 102), (104, 112, 101), (98, 109, 95), (98, 109, 95), (100, 111, 95), (99, 113, 90), (97, 112, 83), (95, 110, 77), (97, 112, 79), (93, 116, 60), (97, 117, 54), (104, 121, 51), (111, 123, 57), (113, 124, 66), (111, 124, 81), (110, 129, 99), (109, 133, 117), (112, 142, 142), (112, 145, 162), (103, 137, 164), (88, 120, 145), (75, 101, 116), (69, 87, 89), (83, 89, 87), (103, 104, 99), (92, 119, 140), (113, 139, 162), (116, 121, 115), (114, 125, 111), (122, 139, 120), (141, 158, 142), (162, 175, 168), (168, 183, 188), (173, 195, 216), (171, 197, 232), (152, 177, 217), (118, 138, 162), (82, 99, 93), (84, 98, 75), (113, 122, 101), (131, 137, 125), (137, 143, 131), (140, 147, 131), (145, 140, 134), (142, 137, 131), (135, 132, 123), (127, 125, 110), (121, 120, 100), (114, 115, 99), (113, 114, 106), (116, 119, 112), (117, 120, 111), (112, 118, 106), (105, 113, 98), (98, 110, 86), (96, 110, 74), (95, 113, 63), (95, 114, 59), (93, 114, 58), (99, 118, 52), (100, 120, 49), (105, 123, 49), (108, 124, 53), (107, 121, 60), (106, 122, 75), (109, 131, 93), (109, 141, 118), (100, 139, 136), (96, 138, 154), (92, 129, 156), (82, 114, 139), (72, 94, 108), (67, 81, 84), (82, 86, 85), (104, 105, 100), (96, 123, 144), (115, 143, 165), (126, 131, 125), (127, 135, 120), (137, 150, 130), (156, 169, 152), (174, 184, 176), (181, 186, 190), (184, 195, 213), (173, 199, 232), (142, 181, 220), (109, 143, 170), (88, 99, 101), (99, 92, 74), (125, 114, 92), (136, 131, 111), (133, 135, 111), (135, 139, 106), (143, 143, 143), (139, 138, 146), (135, 131, 145), (130, 128, 133), (128, 124, 121), (127, 123, 122), (129, 124, 130), (131, 126, 130), (132, 132, 124), (129, 131, 117), (118, 122, 107), (104, 112, 91), (94, 109, 68), (93, 113, 52), (91, 113, 48), (88, 109, 50), (101, 117, 44), (102, 120, 44), (104, 122, 46), (104, 121, 50), (100, 119, 55), (99, 118, 62), (101, 127, 80), (102, 137, 104), (94, 136, 122), (87, 132, 138), (82, 120, 141), (75, 103, 124), (66, 84, 94), (64, 74, 75), (78, 83, 79), (99, 99, 97), (87, 118, 138), (107, 138, 158), (129, 140, 124), (141, 145, 131), (157, 159, 146), (173, 177, 163), (186, 189, 178), (190, 190, 190), (192, 195, 212), (171, 196, 227), (134, 179, 212), (99, 140, 162), (83, 94, 100), (99, 85, 76), (125, 108, 90), (131, 129, 108), (123, 132, 111), (121, 135, 112), (114, 136, 133), (114, 133, 137), (121, 136, 143), (125, 136, 138), (124, 133, 130), (132, 134, 133), (143, 141, 146), (149, 144, 148), (145, 140, 137), (142, 137, 131), (130, 128, 116), (112, 115, 94), (103, 111, 72), (100, 113, 59), (97, 115, 55), (94, 111, 56), (101, 115, 38), (100, 117, 39), (100, 121, 44), (102, 122, 50), (98, 119, 52), (95, 117, 53), (93, 121, 62), (91, 127, 79), (91, 134, 104), (85, 128, 119), (78, 113, 119), (71, 94, 102), (66, 77, 79), (68, 73, 67), (80, 82, 77), (91, 95, 94), (87, 116, 130), (105, 134, 148), (125, 139, 116), (144, 147, 136), (169, 161, 158), (183, 176, 168), (190, 191, 177), (187, 194, 186), (184, 198, 211), (168, 191, 222), (134, 165, 196), (95, 126, 144), (67, 88, 91), (73, 88, 85), (101, 121, 120), (117, 152, 154), (115, 165, 166), (116, 175, 173), (128, 181, 155), (132, 182, 144), (141, 189, 139), (142, 182, 130), (131, 163, 114), (132, 156, 108), (145, 160, 119), (154, 159, 137), (158, 153, 157), (154, 147, 155), (141, 137, 128), (122, 122, 94), (108, 113, 73), (102, 109, 67), (99, 109, 59), (97, 108, 50), (99, 111, 39), (97, 113, 40), (98, 118, 46), (101, 122, 53), (100, 121, 54), (95, 117, 52), (90, 116, 51), (86, 120, 60), (87, 126, 82), (84, 119, 97), (78, 103, 97), (71, 83, 79), (69, 72, 63), (74, 76, 63), (83, 89, 79), (90, 99, 94), (79, 104, 108), (97, 122, 126), (121, 134, 114), (145, 148, 139), (170, 161, 162), (192, 182, 180), (188, 188, 176), (177, 195, 179), (175, 201, 198), (159, 184, 206), (126, 146, 181), (78, 105, 132), (54, 101, 109), (79, 147, 148), (101, 181, 190), (75, 162, 179), (62, 158, 170), (84, 188, 187), (101, 171, 111), (104, 177, 87), (113, 184, 66), (135, 199, 77), (128, 181, 65), (139, 182, 64), (155, 189, 79), (151, 171, 102), (160, 164, 149), (152, 149, 156), (143, 143, 131), (123, 124, 90), (102, 106, 69), (95, 101, 67), (93, 100, 56), (92, 104, 40), (95, 106, 40), (98, 113, 46), (100, 119, 53), (101, 122, 57), (101, 121, 58), (102, 120, 58), (100, 122, 57), (94, 122, 61), (91, 120, 72), (89, 114, 84), (88, 103, 84), (84, 88, 71), (81, 78, 59), (84, 83, 63), (86, 92, 78), (83, 94, 86), (81, 96, 89), (82, 97, 90), (122, 127, 120), (147, 150, 143), (167, 166, 161), (180, 179, 174), (180, 183, 172), (171, 189, 167), (168, 195, 176), (138, 171, 176), (91, 132, 164), (91, 145, 189), (107, 187, 214), (93, 196, 201), (82, 196, 186), (65, 176, 160), (47, 146, 125), (56, 146, 118), (81, 145, 58), (78, 143, 39), (91, 155, 32), (88, 149, 12), (122, 177, 31), (121, 170, 16), (108, 150, 2), (143, 173, 59), (151, 171, 102), (149, 160, 126), (134, 142, 118), (114, 123, 96), (96, 105, 74), (86, 97, 63), (82, 95, 51), (86, 101, 46), (91, 100, 43), (100, 111, 53), (105, 120, 61), (104, 119, 62), (102, 117, 62), (107, 120, 66), (111, 126, 69), (112, 131, 75), (105, 124, 78), (106, 120, 87), (108, 112, 89), (104, 100, 75), (96, 89, 61), (91, 90, 62), (85, 93, 70), (78, 92, 77), (74, 78, 63), (75, 79, 64), (125, 123, 124), (139, 141, 136), (157, 165, 152), (173, 179, 167), (176, 178, 165), (166, 172, 158), (155, 184, 166), (113, 174, 167), (90, 177, 196), (64, 160, 198), (2, 97, 129), (41, 136, 132), (53, 149, 103), (63, 144, 75), (93, 142, 77), (75, 95, 42), (98, 136, 49), (77, 113, 43), (65, 97, 34), (63, 97, 13), (95, 132, 18), (112, 149, 18), (125, 160, 30), (122, 154, 29), (136, 164, 53), (137, 160, 80), (124, 138, 102), (103, 115, 101), (82, 95, 75), (87, 103, 67), (81, 97, 60), (83, 98, 69), (93, 102, 57), (103, 113, 63), (111, 121, 68), (111, 119, 68), (111, 117, 69), (116, 122, 76), (124, 131, 87), (127, 136, 93), (125, 133, 96), (127, 130, 101), (129, 123, 99), (123, 111, 85), (109, 100, 67), (96, 96, 60), (83, 92, 63), (72, 87, 66), (76, 75, 55), (76, 75, 55), (127, 122, 119), (129, 135, 133), (148, 161, 152), (170, 171, 155), (179, 170, 155), (171, 177, 175), (131, 184, 190), (72, 170, 169), (44, 156, 144), (60, 153, 142), (52, 122, 111), (70, 126, 97), (67, 115, 53), (70, 97, 16), (118, 109, 42), (203, 166, 124), (132, 141, 84), (157, 161, 136), (138, 138, 136), (162, 166, 149), (98, 110, 60), (96, 111, 44), (77, 95, 19), (61, 81, 0), (56, 80, 0), (95, 116, 39), (119, 133, 98), (97, 107, 98), (90, 101, 85), (84, 98, 65), (83, 96, 70), (88, 98, 89), (98, 108, 74), (106, 113, 72), (115, 118, 71), (123, 121, 73), (128, 123, 81), (134, 130, 93), (137, 137, 103), (139, 140, 108), (142, 142, 114), (142, 137, 115), (139, 128, 108), (128, 117, 89), (113, 105, 68), (97, 98, 58), (81, 91, 56), (68, 83, 54), (77, 77, 53), (76, 75, 54), (115, 109, 95), (123, 135, 133), (145, 159, 159), (175, 165, 153), (186, 169, 153), (155, 183, 187), (82, 174, 199), (41, 159, 161), (56, 143, 90), (103, 143, 47), (99, 116, 20), (92, 109, 39), (95, 104, 59), (112, 101, 69), (222, 191, 173), (159, 120, 115), (65, 56, 39), (109, 100, 95), (163, 151, 161), (139, 129, 138), (136, 133, 128), (153, 154, 136), (207, 211, 184), (239, 246, 215), (209, 215, 187), (195, 203, 180), (93, 100, 82), (100, 108, 87), (93, 101, 77), (88, 97, 70), (93, 100, 82), (93, 98, 91), (99, 109, 85), (107, 111, 78), (121, 117, 72), (137, 125, 75), (147, 132, 89), (151, 138, 103), (151, 144, 115), (153, 149, 124), (154, 149, 129), (148, 141, 123), (139, 128, 110), (125, 116, 87), (109, 104, 66), (95, 96, 54), (81, 89, 48), (69, 81, 45), (71, 74, 47), (70, 72, 48), (100, 100, 76), (111, 123, 113), (143, 149, 149), (174, 165, 158), (175, 176, 168), (139, 188, 192), (81, 178, 185), (58, 143, 112), (148, 171, 65), (215, 184, 16), (226, 189, 22), (193, 174, 69), (162, 151, 121), (77, 60, 76), (70, 52, 76), (124, 113, 130), (193, 184, 189), (199, 191, 188), (107, 100, 94), (185, 179, 183), (177, 169, 180), (174, 170, 171), (206, 205, 200), (228, 225, 234), (251, 247, 255), (91, 87, 112), (131, 133, 130), (102, 109, 78), (93, 100, 66), (97, 102, 80), (92, 96, 81), (102, 106, 91), (100, 108, 95), (111, 111, 85), (131, 118, 74), (149, 128, 75), (162, 136, 87), (163, 143, 106), (164, 150, 123), (163, 157, 135), (160, 155, 136), (150, 143, 127), (135, 128, 109), (119, 114, 85), (103, 101, 62), (91, 94, 49), (80, 87, 43), (72, 80, 39), (70, 77, 46), (69, 76, 45), (83, 92, 71), (124, 122, 101), (143, 137, 121), (156, 168, 166), (140, 184, 187), (71, 131, 123), (85, 132, 86), (156, 163, 60), (240, 202, 43), (255, 192, 0), (255, 189, 3), (222, 171, 46), (84, 60, 16), (138, 132, 142), (50, 52, 67), (10, 10, 12), (103, 102, 107), (121, 119, 120), (164, 162, 163), (116, 114, 119), (142, 139, 146), (229, 227, 228), (231, 230, 228), (100, 97, 108), (57, 53, 78), (96, 92, 115), (85, 87, 86), (98, 107, 78), (95, 107, 71), (102, 112, 85), (98, 109, 92), (97, 108, 94), (103, 109, 105), (116, 114, 91), (137, 119, 73), (154, 123, 66), (166, 133, 79), (173, 146, 103), (171, 156, 123), (168, 160, 137), (161, 156, 136), (148, 142, 126), (130, 125, 105), (109, 108, 78), (90, 95, 54), (82, 88, 42), (78, 84, 38), (73, 79, 35), (67, 77, 40), (68, 78, 43), (76, 90, 75), (121, 106, 75), (153, 136, 106), (137, 171, 170), (95, 174, 189), (88, 147, 127), (204, 194, 99), (246, 184, 21), (255, 186, 0), (255, 188, 0), (255, 177, 3), (230, 155, 27), (195, 160, 92), (126, 131, 108), (137, 148, 132), (142, 132, 105), (99, 104, 100), (129, 132, 141), (124, 125, 145), (53, 52, 70), (183, 182, 188), (115, 115, 113), (22, 23, 18), (35, 35, 33), (37, 37, 35), (106, 108, 103), (59, 64, 57), (110, 122, 102), (94, 109, 78), (95, 112, 78), (97, 115, 93), (96, 111, 106), (104, 113, 112), (120, 115, 95), (137, 116, 69), (152, 118, 57), (167, 131, 71), (179, 151, 103), (177, 161, 127), (169, 162, 134), (157, 155, 134), (142, 139, 120), (120, 119, 98), (97, 100, 69), (79, 86, 45), (73, 81, 34), (72, 78, 30), (74, 75, 31), (65, 76, 34), (67, 78, 38), (92, 87, 65), (112, 122, 114), (114, 137, 131), (145, 167, 129), (131, 138, 42), (214, 198, 43), (250, 212, 13), (255, 202, 0), (255, 199, 0), (255, 194, 8), (222, 174, 64), (98, 74, 38), (159, 157, 162), (243, 250, 255), (252, 255, 253), (195, 193, 181), (123, 164, 132), (125, 137, 125), (243, 228, 233), (157, 140, 146), (136, 135, 131), (0, 6, 3), (24, 25, 29), (37, 25, 37), (44, 31, 41), (46, 44, 49), (91, 103, 93), (95, 120, 81), (83, 115, 50), (88, 122, 61), (94, 122, 97), (89, 113, 123), (115, 103, 105), (126, 113, 97), (130, 114, 78), (138, 120, 70), (155, 137, 87), (168, 150, 112), (174, 157, 131), (174, 156, 134), (161, 147, 121), (140, 136, 101), (109, 120, 78), (80, 103, 61), (60, 87, 46), (56, 78, 39), (61, 74, 31), (65, 71, 27), (53, 67, 41), (58, 72, 47), (98, 92, 66), (101, 118, 125), (120, 149, 165), (148, 162, 136), (186, 172, 65), (251, 218, 45), (253, 212, 8), (254, 208, 1), (255, 204, 20), (246, 200, 65), (32, 7, 0), (231, 223, 212), (242, 235, 243), (230, 220, 221), (243, 233, 231), (254, 253, 249), (237, 249, 237), (250, 254, 253), (208, 200, 211), (95, 79, 92), (8, 0, 4), (0, 0, 4), (7, 17, 16), (31, 33, 30), (42, 32, 31), (36, 30, 34), (77, 88, 90), (62, 91, 71), (92, 121, 77), (107, 125, 75), (107, 117, 90), (110, 120, 119), (113, 110, 105), (121, 113, 100), (127, 113, 84), (137, 119, 79), (155, 132, 88), (166, 142, 104), (169, 148, 117), (163, 147, 121), (148, 143, 114), (124, 127, 96), (96, 108, 70), (77, 92, 53), (64, 81, 39), (59, 74, 35), (59, 69, 32), (59, 67, 30), (57, 69, 47), (64, 76, 54), (95, 90, 68), (96, 114, 128), (119, 145, 170), (76, 72, 43), (198, 159, 38), (245, 195, 2), (255, 217, 6), (252, 214, 27), (240, 201, 61), (54, 26, 0), (103, 98, 76), (248, 255, 255), (232, 230, 241), (221, 203, 203), (218, 204, 204), (226, 226, 236), (235, 228, 236), (129, 127, 138), (0, 0, 11), (43, 31, 45), (40, 26, 39), (1, 0, 6), (3, 15, 11), (14, 26, 14), (33, 30, 21), (45, 39, 41), (48, 55, 61), (71, 90, 84), (93, 112, 84), (111, 119, 82), (117, 120, 93), (121, 125, 111), (119, 118, 114), (118, 114, 103), (119, 111, 88), (132, 118, 83), (147, 125, 84), (158, 133, 93), (162, 139, 105), (153, 139, 112), (135, 133, 108), (112, 118, 90), (90, 100, 66), (81, 89, 50), (76, 83, 42), (72, 78, 42), (68, 77, 46), (69, 79, 52), (79, 83, 68), (89, 93, 78), (65, 63, 51), (86, 94, 97), (137, 141, 140), (82, 59, 9), (188, 133, 6), (252, 192, 0), (255, 211, 0), (249, 216, 27), (224, 194, 64), (102, 82, 19), (35, 37, 24), (185, 199, 208), (242, 251, 255), (204, 200, 201), (234, 231, 238), (201, 204, 221), (191, 194, 211), (0, 0, 9), (8, 3, 7), (1, 0, 2), (58, 57, 63), (0, 0, 4), (8, 12, 11), (18, 23, 17), (25, 30, 24), (23, 24, 19), (48, 44, 35), (88, 83, 64), (102, 107, 77), (109, 122, 92), (118, 133, 110), (116, 130, 117), (129, 122, 130), (121, 116, 112), (120, 114, 90), (130, 123, 81), (141, 129, 81), (149, 132, 89), (153, 136, 106), (146, 134, 112), (131, 126, 106), (112, 114, 90), (97, 102, 70), (89, 95, 57), (86, 90, 55), (81, 84, 55), (81, 86, 64), (87, 94, 78), (91, 91, 81), (102, 102, 92), (49, 40, 43), (47, 43, 34), (100, 85, 52), (153, 111, 37), (209, 141, 14), (253, 184, 3), (255, 212, 0), (245, 207, 10), (227, 199, 55), (96, 78, 4), (30, 29, 8), (18, 33, 30), (48, 63, 60), (37, 44, 37), (87, 87, 89), (218, 218, 228), (52, 65, 73), (0, 0, 0), (20, 15, 9), (3, 8, 2), (18, 28, 27), (1, 5, 6), (4, 0, 0), (16, 14, 15), (21, 27, 27), (44, 46, 35), (30, 14, 0), (137, 119, 81), (107, 113, 75), (94, 122, 97), (107, 134, 125), (120, 134, 134), (134, 125, 144), (127, 119, 117), (125, 119, 87), (135, 128, 76), (144, 134, 81), (149, 135, 96), (153, 138, 115), (145, 133, 119), (133, 127, 111), (118, 118, 94), (101, 106, 74), (94, 101, 68), (89, 95, 69), (82, 85, 66), (83, 84, 70), (93, 93, 81), (100, 97, 90), (111, 108, 101), (80, 64, 67), (85, 77, 66), (106, 92, 55), (198, 151, 79), (188, 111, 0), (242, 161, 0), (255, 196, 0), (253, 207, 10), (233, 197, 47), (94, 76, 0), (50, 54, 29), (29, 48, 42), (0, 9, 0), (9, 6, 0), (11, 3, 0), (29, 25, 22), (32, 34, 29), (2, 3, 0), (9, 8, 3), (11, 13, 12), (5, 6, 10), (43, 41, 42), (17, 16, 12), (23, 23, 21), (22, 21, 19), (18, 10, 0), (30, 23, 0), (90, 100, 63), (79, 114, 82), (93, 135, 123), (113, 137, 141), (129, 129, 141), (131, 130, 144), (128, 125, 118), (126, 120, 86), (137, 124, 72), (148, 130, 80), (155, 137, 101), (157, 142, 123), (148, 140, 127), (129, 130, 114), (111, 119, 96), (94, 104, 79), (91, 99, 78), (93, 97, 83), (86, 88, 77), (83, 83, 73), (89, 90, 76), (97, 97, 87), (106, 106, 96), (79, 64, 57), (67, 66, 64), (103, 99, 88), (135, 99, 51), (169, 96, 0), (233, 148, 0), (247, 175, 0), (243, 184, 4), (229, 182, 40), (114, 89, 7), (51, 62, 32), (26, 53, 46), (16, 32, 19), (29, 27, 4), (43, 37, 21), (4, 9, 5), (18, 14, 3), (0, 2, 0), (1, 3, 2), (18, 8, 16), (24, 8, 18), (11, 9, 12), (3, 14, 8), (15, 25, 17), (13, 8, 4), (7, 4, 0), (70, 100, 90), (32, 100, 87), (21, 100, 94), (31, 91, 92), (64, 91, 102), (137, 141, 153), (122, 130, 132), (126, 129, 118), (128, 123, 93), (137, 122, 81), (153, 132, 87), (162, 140, 103), (160, 144, 118), (148, 143, 123), (123, 130, 112), (106, 119, 102), (88, 100, 88), (87, 92, 85), (93, 94, 89), (87, 86, 81), (79, 82, 71), (81, 88, 72), (88, 92, 77), (95, 99, 84), (75, 76, 60), (23, 29, 29), (45, 44, 50), (109, 84, 64), (174, 125, 49), (198, 131, 0), (248, 176, 12), (255, 201, 37), (240, 178, 41), (135, 101, 4), (84, 85, 28), (45, 71, 42), (55, 86, 70), (0, 11, 1), (12, 31, 29), (5, 26, 31), (18, 33, 26), (0, 7, 0), (1, 0, 0), (8, 0, 0), (10, 0, 3), (0, 2, 5), (0, 8, 6), (0, 8, 4), (0, 5, 4), (0, 9, 14), (87, 165, 177), (67, 180, 196), (42, 155, 171), (81, 165, 176), (60, 119, 127), (0, 15, 21), (108, 124, 121), (120, 132, 122), (127, 130, 109), (139, 134, 102), (157, 145, 103), (164, 151, 107), (157, 148, 109), (143, 139, 110), (126, 129, 112), (111, 116, 110), (92, 96, 95), (87, 87, 87), (87, 88, 83), (77, 80, 71), (66, 77, 61), (69, 84, 65), (66, 73, 55), (71, 78, 60), (21, 38, 22), (42, 43, 38), (81, 69, 73), (124, 107, 100), (90, 69, 24), (163, 123, 27), (202, 136, 0), (238, 158, 7), (255, 190, 44), (228, 177, 49), (202, 178, 72), (123, 130, 53), (46, 78, 39), (72, 113, 105), (0, 11, 13), (17, 31, 34), (35, 61, 58), (0, 6, 0), (6, 5, 0), (0, 5, 0), (0, 12, 1), (0, 7, 9), (0, 5, 12), (0, 8, 14), (0, 12, 19), (73, 161, 173), (66, 183, 201), (50, 174, 198), (48, 168, 192), (55, 171, 186), (102, 214, 218), (133, 242, 237), (0, 28, 35), (95, 127, 126), (126, 144, 128), (134, 139, 107), (151, 150, 106), (154, 152, 104), (154, 152, 113), (144, 140, 113), (126, 120, 108), (119, 111, 108), (100, 91, 92), (91, 90, 86), (66, 72, 62), (53, 64, 50), (56, 70, 53), (48, 65, 46), (51, 60, 39), (49, 58, 37), (16, 29, 22), (19, 10, 5), (43, 19, 19), (53, 38, 35), (59, 51, 30), (72, 43, 0), (193, 130, 27), (239, 157, 21), (189, 111, 0), (218, 156, 0), (225, 175, 24), (181, 154, 25), (135, 135, 45), (83, 96, 40), (53, 48, 10), (95, 60, 28), (51, 38, 21), (76, 64, 26), (147, 160, 107), (92, 144, 105), (77, 143, 131), (46, 83, 89), (1, 3, 15), (0, 4, 14), (54, 132, 144), (83, 209, 223), (57, 185, 198), (66, 178, 192), (81, 193, 213), (40, 171, 191), (68, 209, 216), (72, 211, 204), (137, 233, 255), (0, 25, 34), (117, 155, 144), (141, 150, 121), (158, 153, 115), (155, 150, 112), (145, 146, 115), (135, 137, 115), (118, 115, 100), (103, 95, 84), (85, 77, 66), (80, 78, 65), (65, 71, 57), (61, 72, 56), (58, 71, 53), (52, 63, 46), (49, 58, 37), (47, 56, 35), (2, 0, 3), (14, 0, 1), (17, 0, 0), (10, 0, 0), (8, 0, 0), (99, 67, 28), (130, 66, 0), (235, 155, 44), (246, 170, 33), (209, 144, 0), (236, 175, 9), (242, 185, 20), (204, 155, 0), (209, 162, 24), (220, 153, 38), (250, 161, 59), (158, 77, 12), (185, 148, 78), (154, 188, 128), (78, 167, 137), (69, 163, 163), (61, 113, 126), (0, 6, 13), (10, 51, 55), (90, 187, 196), (46, 177, 187), (42, 165, 172), (75, 179, 190), (69, 178, 199), (65, 193, 220), (53, 186, 201), (66, 192, 191), (58, 207, 237), (94, 210, 225), (0, 20, 16), (142, 163, 144), (165, 159, 137), (165, 152, 133), (157, 152, 133), (127, 132, 112), (110, 118, 94), (92, 98, 70), (87, 90, 63), (91, 92, 74), (89, 91, 78), (95, 97, 84), (91, 95, 78), (88, 93, 71), (79, 83, 68), (78, 82, 67), (5, 0, 7), (8, 0, 9), (8, 0, 11), (6, 0, 4), (8, 0, 0), (84, 52, 11), (137, 74, 7), (143, 66, 0), (162, 89, 0), (199, 134, 8), (240, 175, 23), (242, 171, 0), (254, 182, 0), (255, 189, 0), (246, 158, 0), (246, 146, 0), (241, 140, 0), (144, 101, 0), (83, 119, 73), (71, 163, 158), (66, 168, 180), (6, 86, 93), (0, 60, 63), (95, 165, 167), (69, 164, 170), (60, 177, 184), (69, 192, 199), (76, 193, 210), (67, 185, 213), (74, 193, 225), (84, 201, 221), (83, 194, 203), (54, 212, 239), (77, 216, 235), (99, 203, 212), (0, 50, 51), (175, 200, 197), (162, 163, 158), (154, 148, 136), (148, 150, 126), (119, 131, 95), (98, 116, 78), (97, 110, 80), (108, 111, 94), (111, 107, 98), (117, 110, 100), (117, 116, 96), (116, 120, 93), (110, 112, 99), (109, 111, 98), (0, 6, 15), (6, 0, 12), (11, 0, 15), (2, 2, 10), (0, 3, 0), (51, 31, 0), (129, 72, 0), (147, 69, 0), (148, 74, 0), (149, 81, 0), (179, 110, 0), (229, 155, 0), (240, 177, 0), (249, 197, 0), (255, 211, 0), (255, 215, 0), (255, 237, 20), (219, 184, 54), (62, 66, 31), (81, 135, 145), (65, 162, 168), (71, 186, 183), (71, 174, 181), (80, 167, 184), (75, 163, 173), (76, 185, 188), (61, 192, 200), (58, 194, 218), (47, 176, 207), (43, 163, 188), (83, 202, 222), (64, 185, 202), (42, 166, 190), (49, 181, 202), (57, 194, 213), (99, 222, 238), (29, 117, 129), (165, 209, 212), (155, 165, 154), (155, 151, 124), (142, 143, 109), (118, 129, 95), (110, 122, 100), (120, 123, 114), (123, 118, 114), (122, 115, 105), (127, 126, 105), (126, 131, 99), (123, 121, 109), (124, 122, 110), (0, 8, 17), (1, 0, 2), (7, 0, 0), (0, 3, 9), (0, 7, 0), (58, 46, 0), (150, 93, 6), (195, 113, 14), (170, 93, 1), (192, 120, 18), (252, 176, 39), (255, 193, 24), (255, 203, 19), (236, 208, 20), (244, 223, 18), (251, 223, 0), (242, 248, 0), (255, 228, 68), (119, 71, 22), (100, 99, 94), (72, 149, 141), (22, 151, 146), (63, 189, 204), (77, 175, 204), (89, 178, 194), (81, 189, 191), (53, 181, 190), (62, 198, 220), (45, 181, 203), (54, 187, 202), (62, 198, 214), (61, 200, 223), (89, 185, 207), (62, 183, 204), (60, 210, 234), (37, 197, 221), (79, 218, 237), (0, 89, 97), (164, 207, 200), (134, 143, 124), (131, 127, 102), (116, 114, 91), (112, 114, 100), (121, 124, 117), (120, 121, 116), (113, 113, 103), (123, 125, 104), (127, 130, 103), (120, 118, 105), (122, 120, 107), (0, 0, 9), (7, 2, 0), (1, 1, 0), (0, 3, 5), (0, 2, 5), (72, 46, 11), (201, 134, 47), (255, 168, 48), (241, 158, 36), (213, 139, 18), (215, 137, 1), (254, 174, 17), (246, 173, 6), (239, 188, 11), (241, 204, 12), (242, 210, 3), (221, 224, 0), (255, 217, 33), (215, 122, 29), (77, 29, 0), (82, 128, 117), (41, 154, 160), (45, 167, 191), (64, 169, 198), (47, 147, 162), (76, 181, 184), (74, 186, 190), (65, 186, 195), (61, 195, 206), (47, 194, 202), (48, 193, 210), (54, 192, 218), (89, 196, 214), (85, 206, 225), (57, 198, 218), (42, 194, 215), (27, 174, 194), (56, 178, 193), (25, 105, 112), (153, 192, 189), (115, 123, 110), (105, 99, 83), (107, 104, 89), (109, 112, 101), (105, 115, 107), (101, 108, 100), (110, 110, 98), (120, 114, 98), (113, 111, 96), (116, 114, 99), (15, 0, 3), (7, 0, 0), (0, 4, 0), (0, 5, 7), (6, 0, 7), (60, 13, 0), (161, 83, 1), (217, 126, 0), (222, 138, 0), (200, 127, 0), (192, 118, 0), (226, 137, 0), (255, 164, 1), (255, 174, 0), (255, 181, 0), (255, 202, 8), (248, 217, 0), (255, 196, 0), (255, 157, 27), (111, 41, 0), (26, 45, 39), (64, 152, 174), (31, 145, 172), (41, 153, 175), (51, 159, 169), (42, 142, 144), (89, 181, 180), (83, 186, 185), (51, 183, 185), (27, 181, 189), (55, 200, 219), (52, 176, 202), (43, 179, 193), (72, 204, 217), (86, 212, 227), (86, 213, 232), (45, 177, 198), (57, 186, 208), (45, 150, 169), (62, 129, 137), (112, 137, 131), (93, 91, 76), (89, 82, 63), (80, 82, 68), (76, 89, 79), (75, 86, 78), (79, 76, 69), (89, 74, 67), (85, 84, 66), (87, 86, 68), (0, 5, 2), (1, 1, 1), (6, 0, 0), (0, 1, 0), (0, 3, 4), (9, 0, 1), (41, 0, 0), (137, 61, 25), (163, 85, 0), (194, 116, 0), (211, 120, 0), (237, 132, 15), (238, 138, 26), (245, 162, 30), (250, 182, 11), (255, 198, 0), (255, 202, 14), (255, 213, 25), (255, 197, 31), (136, 51, 0), (98, 29, 0), (64, 58, 62), (80, 153, 168), (38, 161, 176), (51, 175, 185), (45, 151, 151), (72, 172, 162), (77, 184, 174), (63, 181, 185), (62, 188, 210), (54, 189, 211), (48, 191, 208), (46, 186, 213), (55, 186, 206), (62, 190, 203), (100, 233, 242), (79, 210, 218), (40, 157, 167), (107, 217, 234), (71, 186, 213), (51, 166, 185), (29, 106, 100), (57, 74, 40), (74, 62, 20), (57, 60, 31), (33, 56, 40), (28, 39, 22), (55, 41, 14), (49, 56, 23), (58, 65, 32), (0, 2, 0), (0, 2, 1), (3, 0, 0), (3, 1, 4), (0, 0, 5), (0, 1, 6), (16, 0, 0), (82, 28, 0), (144, 63, 0), (194, 105, 1), (226, 138, 15), (223, 128, 8), (212, 107, 0), (232, 129, 0), (255, 185, 17), (240, 189, 0), (255, 190, 4), (246, 189, 0), (255, 212, 34), (198, 123, 0), (105, 28, 0), (53, 24, 16), (66, 114, 124), (44, 150, 163), (45, 165, 179), (53, 160, 170), (62, 162, 164), (75, 185, 186), (56, 180, 190), (69, 200, 220), (70, 203, 222), (43, 177, 189), (53, 182, 211), (67, 196, 217), (46, 182, 194), (65, 209, 217), (56, 195, 202), (63, 185, 196), (42, 157, 175), (109, 233, 255), (31, 152, 171), (77, 157, 156), (34, 52, 28), (58, 43, 10), (39, 39, 13), (18, 39, 20), (23, 36, 16), (42, 32, 5), (41, 48, 14), (47, 54, 20), (3, 0, 0), (2, 2, 2), (0, 0, 0), (5, 0, 6), (0, 0, 7), (0, 3, 11), (0, 6, 6), (21, 0, 0), (122, 57, 15), (160, 73, 0), (184, 95, 0), (212, 118, 4), (236, 125, 9), (214, 99, 0), (249, 161, 0), (246, 193, 1), (245, 179, 0), (239, 186, 0), (249, 201, 3), (255, 198, 48), (115, 37, 0), (89, 29, 1), (31, 33, 30), (79, 149, 157), (30, 139, 159), (47, 157, 182), (58, 161, 178), (63, 175, 189), (47, 180, 199), (41, 182, 209), (54, 187, 204), (48, 167, 171), (59, 187, 216), (63, 196, 215), (49, 193, 201), (48, 201, 206), (51, 195, 204), (68, 194, 209), (53, 172, 192), (66, 195, 216), (118, 248, 255), (17, 112, 116), (40, 78, 67), (34, 33, 12), (38, 38, 14), (31, 45, 20), (41, 51, 27), (49, 45, 20), (46, 56, 19), (50, 60, 23), (7, 0, 1), (4, 0, 1), (0, 0, 2), (0, 1, 3), (0, 2, 5), (0, 4, 11), (0, 8, 15), (0, 1, 0), (22, 0, 0), (120, 56, 8), (179, 88, 15), (222, 114, 23), (228, 117, 9), (235, 132, 1), (255, 171, 12), (255, 184, 7), (252, 191, 14), (255, 202, 0), (249, 203, 0), (255, 214, 38), (195, 124, 20), (106, 28, 0), (65, 19, 0), (74, 98, 100), (65, 153, 177), (32, 145, 179), (53, 162, 185), (48, 161, 177), (42, 182, 207), (21, 176, 207), (69, 206, 224), (68, 179, 173), (50, 190, 215), (65, 205, 220), (52, 193, 200), (48, 195, 202), (57, 200, 216), (59, 187, 212), (63, 181, 207), (58, 180, 201), (80, 212, 225), (121, 242, 250), (96, 176, 177), (6, 39, 28), (36, 41, 18), (51, 51, 23), (45, 45, 21), (45, 46, 28), (50, 61, 21), (51, 62, 22), (4, 0, 5), (6, 0, 4), (4, 0, 5), (0, 2, 0), (0, 4, 0), (0, 2, 5), (0, 2, 12), (0, 3, 12), (0, 6, 0), (21, 0, 0), (143, 66, 24), (155, 47, 0), (176, 73, 0), (208, 120, 0), (240, 151, 5), (255, 168, 9), (247, 190, 12), (248, 192, 0), (248, 198, 0), (253, 204, 14), (251, 188, 57), (122, 40, 0), (99, 25, 0), (48, 29, 23), (55, 108, 126), (41, 141, 165), (47, 158, 175), (35, 155, 169), (24, 164, 189), (28, 181, 215), (61, 202, 220), (75, 194, 190), (41, 198, 217), (75, 217, 231), (49, 177, 186), (69, 200, 210), (56, 195, 214), (60, 194, 223), (74, 195, 224), (43, 160, 178), (71, 201, 214), (60, 202, 214), (87, 213, 225), (29, 105, 103), (29, 51, 30), (54, 45, 14), (46, 42, 17), (41, 51, 40), (49, 61, 23), (46, 58, 20), (1, 0, 5), (3, 0, 5), (3, 0, 4), (0, 1, 0), (0, 7, 0), (0, 2, 0), (1, 0, 4), (0, 1, 13), (0, 3, 11), (2, 1, 0), (55, 17, 0), (135, 60, 21), (162, 70, 5), (178, 88, 0), (208, 116, 0), (250, 155, 13), (244, 180, 0), (251, 191, 0), (243, 187, 0), (250, 196, 2), (255, 212, 53), (140, 65, 0), (100, 26, 0), (72, 24, 12), (22, 26, 25), (73, 135, 134), (39, 144, 147), (15, 143, 156), (35, 170, 192), (36, 172, 196), (36, 173, 189), (41, 179, 189), (54, 207, 225), (73, 209, 225), (62, 178, 191), (68, 181, 195), (80, 209, 230), (38, 173, 202), (63, 192, 221), (60, 181, 198), (62, 190, 201), (51, 198, 214), (36, 182, 205), (65, 173, 185), (14, 61, 45), (37, 43, 9), (41, 43, 19), (27, 44, 34), (36, 47, 15), (31, 42, 10), (0, 1, 2), (0, 0, 4), (0, 0, 5), (4, 0, 1), (5, 2, 0), (3, 3, 0), (1, 0, 0), (3, 0, 5), (1, 0, 11), (0, 2, 9), (0, 1, 0), (40, 13, 0), (133, 63, 27), (141, 43, 0), (181, 87, 0), (226, 146, 23), (249, 167, 0), (249, 178, 12), (246, 183, 10), (250, 187, 0), (255, 196, 13), (192, 129, 0), (96, 32, 0), (99, 37, 12), (69, 29, 4), (42, 56, 30), (61, 141, 132), (36, 154, 166), (29, 150, 167), (39, 157, 167), (42, 174, 186), (21, 173, 196), (37, 173, 189), (83, 212, 231), (18, 135, 153), (87, 190, 207), (87, 193, 209), (56, 176, 200), (60, 198, 224), (46, 187, 204), (48, 186, 197), (39, 180, 198), (55, 198, 228), (107, 232, 254), (90, 175, 168), (0, 39, 9), (30, 48, 22), (23, 36, 26), (32, 40, 17), (26, 34, 11), (0, 3, 0), (0, 3, 1), (0, 0, 4), (7, 0, 3), (7, 0, 0), (4, 1, 0), (2, 3, 0), (6, 0, 0), (10, 0, 4), (1, 0, 5), (0, 6, 6), (5, 6, 0), (57, 18, 3), (133, 53, 20), (142, 53, 0), (203, 124, 29), (246, 151, 5), (246, 156, 16), (255, 176, 25), (255, 188, 5), (255, 199, 6), (246, 189, 38), (161, 99, 12), (97, 27, 0), (99, 36, 0), (58, 34, 0), (4, 38, 24), (64, 144, 155), (50, 152, 166), (43, 156, 162), (24, 155, 165), (21, 167, 190), (45, 162, 171), (64, 194, 216), (0, 122, 151), (84, 176, 197), (97, 165, 176), (48, 134, 149), (56, 191, 213), (46, 208, 229), (45, 199, 211), (50, 183, 200), (61, 192, 220), (63, 203, 230), (115, 244, 249), (6, 91, 72), (27, 56, 34), (70, 62, 51), (68, 72, 57), (62, 66, 51), (0, 5, 0), (0, 2, 0), (3, 0, 2), (4, 0, 4), (3, 0, 0), (1, 0, 0), (1, 0, 0), (6, 0, 0), (8, 0, 0), (6, 0, 0), (0, 0, 2), (1, 5, 8), (11, 0, 0), (63, 20, 1), (127, 55, 7), (128, 35, 0), (176, 76, 0), (245, 141, 20), (255, 156, 11), (252, 173, 0), (254, 193, 4), (250, 191, 25), (251, 182, 65), (115, 41, 0), (101, 38, 0), (90, 45, 12), (55, 41, 30), (35, 66, 71), (49, 136, 146), (29, 152, 159), (25, 156, 164), (28, 151, 166), (40, 150, 149), (40, 180, 203), (19, 157, 194), (10, 91, 118), (17, 46, 52), (43, 90, 98), (66, 188, 211), (25, 200, 227), (40, 207, 223), (52, 183, 193), (81, 206, 226), (38, 192, 218), (68, 231, 248), (80, 196, 193), (51, 83, 70), (120, 88, 75), (101, 105, 91), (93, 97, 83)]
le 4ème pixel est :  (117, 144, 161)
la composante Rouge du 4ème pixel est :  117
la composante Verte du 4ème pixel est :  144
la composante Bleue du 4ème pixel est :  161

On peut alors appliquer des transformations sur ces pixels en manipulant ce tableau. Par exemple, on peut appliquer un filtre rouge à notre image en conservant uniquement la nuance de rouge de chaque pixel et en remplaçant les composantes verte et bleue par 0.

In [8]:
from PIL import Image # on importe le module Image de la bibliothèque PIL
img = Image.open("perroquet.jpg")
pixels = list(img.getdata()) 
display(img)

# TRANSFORMATION DE L'IMAGE
new_pixels = [0]*len(pixels) # on crée une liste de la même taille que 'pixels'

for i in range(len(pixels)):
    new_pixels[i] = (pixels[i][0],0,0) # chaque élément de 'new_pixels' est l'élément (R,0,0) de 'pixels'

img.putdata(new_pixels) # on copie cette nouvelle liste de pixels dans les données de 'img'

# RESULTAT
display(img) # on affiche l'image 'img' ainsi transformée
print(new_pixels) # on affiche les valeurs des nouveaux pixels pour comprendre la transformation
img.close() # on ferme le flux
[(100, 0, 0), (95, 0, 0), (97, 0, 0), (117, 0, 0), (147, 0, 0), (165, 0, 0), (172, 0, 0), (166, 0, 0), (150, 0, 0), (124, 0, 0), (82, 0, 0), (78, 0, 0), (100, 0, 0), (116, 0, 0), (128, 0, 0), (130, 0, 0), (136, 0, 0), (131, 0, 0), (132, 0, 0), (129, 0, 0), (115, 0, 0), (105, 0, 0), (98, 0, 0), (87, 0, 0), (78, 0, 0), (86, 0, 0), (94, 0, 0), (99, 0, 0), (96, 0, 0), (86, 0, 0), (75, 0, 0), (64, 0, 0), (76, 0, 0), (87, 0, 0), (99, 0, 0), (110, 0, 0), (112, 0, 0), (110, 0, 0), (108, 0, 0), (110, 0, 0), (108, 0, 0), (110, 0, 0), (99, 0, 0), (87, 0, 0), (82, 0, 0), (76, 0, 0), (75, 0, 0), (86, 0, 0), (88, 0, 0), (111, 0, 0), (93, 0, 0), (92, 0, 0), (97, 0, 0), (111, 0, 0), (137, 0, 0), (160, 0, 0), (176, 0, 0), (171, 0, 0), (151, 0, 0), (120, 0, 0), (81, 0, 0), (85, 0, 0), (113, 0, 0), (131, 0, 0), (145, 0, 0), (149, 0, 0), (142, 0, 0), (134, 0, 0), (128, 0, 0), (122, 0, 0), (113, 0, 0), (104, 0, 0), (97, 0, 0), (90, 0, 0), (84, 0, 0), (88, 0, 0), (95, 0, 0), (100, 0, 0), (97, 0, 0), (91, 0, 0), (80, 0, 0), (76, 0, 0), (80, 0, 0), (88, 0, 0), (101, 0, 0), (110, 0, 0), (113, 0, 0), (110, 0, 0), (107, 0, 0), (105, 0, 0), (106, 0, 0), (108, 0, 0), (99, 0, 0), (85, 0, 0), (78, 0, 0), (74, 0, 0), (77, 0, 0), (91, 0, 0), (87, 0, 0), (110, 0, 0), (95, 0, 0), (100, 0, 0), (107, 0, 0), (116, 0, 0), (135, 0, 0), (157, 0, 0), (176, 0, 0), (172, 0, 0), (150, 0, 0), (117, 0, 0), (81, 0, 0), (89, 0, 0), (122, 0, 0), (143, 0, 0), (155, 0, 0), (158, 0, 0), (140, 0, 0), (133, 0, 0), (124, 0, 0), (117, 0, 0), (110, 0, 0), (105, 0, 0), (102, 0, 0), (100, 0, 0), (96, 0, 0), (95, 0, 0), (97, 0, 0), (102, 0, 0), (100, 0, 0), (93, 0, 0), (87, 0, 0), (87, 0, 0), (86, 0, 0), (91, 0, 0), (102, 0, 0), (111, 0, 0), (113, 0, 0), (111, 0, 0), (107, 0, 0), (103, 0, 0), (111, 0, 0), (113, 0, 0), (104, 0, 0), (87, 0, 0), (76, 0, 0), (72, 0, 0), (80, 0, 0), (97, 0, 0), (91, 0, 0), (114, 0, 0), (106, 0, 0), (107, 0, 0), (115, 0, 0), (129, 0, 0), (147, 0, 0), (158, 0, 0), (171, 0, 0), (172, 0, 0), (153, 0, 0), (119, 0, 0), (80, 0, 0), (84, 0, 0), (115, 0, 0), (134, 0, 0), (142, 0, 0), (144, 0, 0), (144, 0, 0), (141, 0, 0), (132, 0, 0), (122, 0, 0), (114, 0, 0), (106, 0, 0), (104, 0, 0), (105, 0, 0), (104, 0, 0), (98, 0, 0), (98, 0, 0), (100, 0, 0), (99, 0, 0), (97, 0, 0), (95, 0, 0), (97, 0, 0), (93, 0, 0), (97, 0, 0), (104, 0, 0), (111, 0, 0), (113, 0, 0), (111, 0, 0), (110, 0, 0), (109, 0, 0), (112, 0, 0), (112, 0, 0), (103, 0, 0), (88, 0, 0), (75, 0, 0), (69, 0, 0), (83, 0, 0), (103, 0, 0), (92, 0, 0), (113, 0, 0), (116, 0, 0), (114, 0, 0), (122, 0, 0), (141, 0, 0), (162, 0, 0), (168, 0, 0), (173, 0, 0), (171, 0, 0), (152, 0, 0), (118, 0, 0), (82, 0, 0), (84, 0, 0), (113, 0, 0), (131, 0, 0), (137, 0, 0), (140, 0, 0), (145, 0, 0), (142, 0, 0), (135, 0, 0), (127, 0, 0), (121, 0, 0), (114, 0, 0), (113, 0, 0), (116, 0, 0), (117, 0, 0), (112, 0, 0), (105, 0, 0), (98, 0, 0), (96, 0, 0), (95, 0, 0), (95, 0, 0), (93, 0, 0), (99, 0, 0), (100, 0, 0), (105, 0, 0), (108, 0, 0), (107, 0, 0), (106, 0, 0), (109, 0, 0), (109, 0, 0), (100, 0, 0), (96, 0, 0), (92, 0, 0), (82, 0, 0), (72, 0, 0), (67, 0, 0), (82, 0, 0), (104, 0, 0), (96, 0, 0), (115, 0, 0), (126, 0, 0), (127, 0, 0), (137, 0, 0), (156, 0, 0), (174, 0, 0), (181, 0, 0), (184, 0, 0), (173, 0, 0), (142, 0, 0), (109, 0, 0), (88, 0, 0), (99, 0, 0), (125, 0, 0), (136, 0, 0), (133, 0, 0), (135, 0, 0), (143, 0, 0), (139, 0, 0), (135, 0, 0), (130, 0, 0), (128, 0, 0), (127, 0, 0), (129, 0, 0), (131, 0, 0), (132, 0, 0), (129, 0, 0), (118, 0, 0), (104, 0, 0), (94, 0, 0), (93, 0, 0), (91, 0, 0), (88, 0, 0), (101, 0, 0), (102, 0, 0), (104, 0, 0), (104, 0, 0), (100, 0, 0), (99, 0, 0), (101, 0, 0), (102, 0, 0), (94, 0, 0), (87, 0, 0), (82, 0, 0), (75, 0, 0), (66, 0, 0), (64, 0, 0), (78, 0, 0), (99, 0, 0), (87, 0, 0), (107, 0, 0), (129, 0, 0), (141, 0, 0), (157, 0, 0), (173, 0, 0), (186, 0, 0), (190, 0, 0), (192, 0, 0), (171, 0, 0), (134, 0, 0), (99, 0, 0), (83, 0, 0), (99, 0, 0), (125, 0, 0), (131, 0, 0), (123, 0, 0), (121, 0, 0), (114, 0, 0), (114, 0, 0), (121, 0, 0), (125, 0, 0), (124, 0, 0), (132, 0, 0), (143, 0, 0), (149, 0, 0), (145, 0, 0), (142, 0, 0), (130, 0, 0), (112, 0, 0), (103, 0, 0), (100, 0, 0), (97, 0, 0), (94, 0, 0), (101, 0, 0), (100, 0, 0), (100, 0, 0), (102, 0, 0), (98, 0, 0), (95, 0, 0), (93, 0, 0), (91, 0, 0), (91, 0, 0), (85, 0, 0), (78, 0, 0), (71, 0, 0), (66, 0, 0), (68, 0, 0), (80, 0, 0), (91, 0, 0), (87, 0, 0), (105, 0, 0), (125, 0, 0), (144, 0, 0), (169, 0, 0), (183, 0, 0), (190, 0, 0), (187, 0, 0), (184, 0, 0), (168, 0, 0), (134, 0, 0), (95, 0, 0), (67, 0, 0), (73, 0, 0), (101, 0, 0), (117, 0, 0), (115, 0, 0), (116, 0, 0), (128, 0, 0), (132, 0, 0), (141, 0, 0), (142, 0, 0), (131, 0, 0), (132, 0, 0), (145, 0, 0), (154, 0, 0), (158, 0, 0), (154, 0, 0), (141, 0, 0), (122, 0, 0), (108, 0, 0), (102, 0, 0), (99, 0, 0), (97, 0, 0), (99, 0, 0), (97, 0, 0), (98, 0, 0), (101, 0, 0), (100, 0, 0), (95, 0, 0), (90, 0, 0), (86, 0, 0), (87, 0, 0), (84, 0, 0), (78, 0, 0), (71, 0, 0), (69, 0, 0), (74, 0, 0), (83, 0, 0), (90, 0, 0), (79, 0, 0), (97, 0, 0), (121, 0, 0), (145, 0, 0), (170, 0, 0), (192, 0, 0), (188, 0, 0), (177, 0, 0), (175, 0, 0), (159, 0, 0), (126, 0, 0), (78, 0, 0), (54, 0, 0), (79, 0, 0), (101, 0, 0), (75, 0, 0), (62, 0, 0), (84, 0, 0), (101, 0, 0), (104, 0, 0), (113, 0, 0), (135, 0, 0), (128, 0, 0), (139, 0, 0), (155, 0, 0), (151, 0, 0), (160, 0, 0), (152, 0, 0), (143, 0, 0), (123, 0, 0), (102, 0, 0), (95, 0, 0), (93, 0, 0), (92, 0, 0), (95, 0, 0), (98, 0, 0), (100, 0, 0), (101, 0, 0), (101, 0, 0), (102, 0, 0), (100, 0, 0), (94, 0, 0), (91, 0, 0), (89, 0, 0), (88, 0, 0), (84, 0, 0), (81, 0, 0), (84, 0, 0), (86, 0, 0), (83, 0, 0), (81, 0, 0), (82, 0, 0), (122, 0, 0), (147, 0, 0), (167, 0, 0), (180, 0, 0), (180, 0, 0), (171, 0, 0), (168, 0, 0), (138, 0, 0), (91, 0, 0), (91, 0, 0), (107, 0, 0), (93, 0, 0), (82, 0, 0), (65, 0, 0), (47, 0, 0), (56, 0, 0), (81, 0, 0), (78, 0, 0), (91, 0, 0), (88, 0, 0), (122, 0, 0), (121, 0, 0), (108, 0, 0), (143, 0, 0), (151, 0, 0), (149, 0, 0), (134, 0, 0), (114, 0, 0), (96, 0, 0), (86, 0, 0), (82, 0, 0), (86, 0, 0), (91, 0, 0), (100, 0, 0), (105, 0, 0), (104, 0, 0), (102, 0, 0), (107, 0, 0), (111, 0, 0), (112, 0, 0), (105, 0, 0), (106, 0, 0), (108, 0, 0), (104, 0, 0), (96, 0, 0), (91, 0, 0), (85, 0, 0), (78, 0, 0), (74, 0, 0), (75, 0, 0), (125, 0, 0), (139, 0, 0), (157, 0, 0), (173, 0, 0), (176, 0, 0), (166, 0, 0), (155, 0, 0), (113, 0, 0), (90, 0, 0), (64, 0, 0), (2, 0, 0), (41, 0, 0), (53, 0, 0), (63, 0, 0), (93, 0, 0), (75, 0, 0), (98, 0, 0), (77, 0, 0), (65, 0, 0), (63, 0, 0), (95, 0, 0), (112, 0, 0), (125, 0, 0), (122, 0, 0), (136, 0, 0), (137, 0, 0), (124, 0, 0), (103, 0, 0), (82, 0, 0), (87, 0, 0), (81, 0, 0), (83, 0, 0), (93, 0, 0), (103, 0, 0), (111, 0, 0), (111, 0, 0), (111, 0, 0), (116, 0, 0), (124, 0, 0), (127, 0, 0), (125, 0, 0), (127, 0, 0), (129, 0, 0), (123, 0, 0), (109, 0, 0), (96, 0, 0), (83, 0, 0), (72, 0, 0), (76, 0, 0), (76, 0, 0), (127, 0, 0), (129, 0, 0), (148, 0, 0), (170, 0, 0), (179, 0, 0), (171, 0, 0), (131, 0, 0), (72, 0, 0), (44, 0, 0), (60, 0, 0), (52, 0, 0), (70, 0, 0), (67, 0, 0), (70, 0, 0), (118, 0, 0), (203, 0, 0), (132, 0, 0), (157, 0, 0), (138, 0, 0), (162, 0, 0), (98, 0, 0), (96, 0, 0), (77, 0, 0), (61, 0, 0), (56, 0, 0), (95, 0, 0), (119, 0, 0), (97, 0, 0), (90, 0, 0), (84, 0, 0), (83, 0, 0), (88, 0, 0), (98, 0, 0), (106, 0, 0), (115, 0, 0), (123, 0, 0), (128, 0, 0), (134, 0, 0), (137, 0, 0), (139, 0, 0), (142, 0, 0), (142, 0, 0), (139, 0, 0), (128, 0, 0), (113, 0, 0), (97, 0, 0), (81, 0, 0), (68, 0, 0), (77, 0, 0), (76, 0, 0), (115, 0, 0), (123, 0, 0), (145, 0, 0), (175, 0, 0), (186, 0, 0), (155, 0, 0), (82, 0, 0), (41, 0, 0), (56, 0, 0), (103, 0, 0), (99, 0, 0), (92, 0, 0), (95, 0, 0), (112, 0, 0), (222, 0, 0), (159, 0, 0), (65, 0, 0), (109, 0, 0), (163, 0, 0), (139, 0, 0), (136, 0, 0), (153, 0, 0), (207, 0, 0), (239, 0, 0), (209, 0, 0), (195, 0, 0), (93, 0, 0), (100, 0, 0), (93, 0, 0), (88, 0, 0), (93, 0, 0), (93, 0, 0), (99, 0, 0), (107, 0, 0), (121, 0, 0), (137, 0, 0), (147, 0, 0), (151, 0, 0), (151, 0, 0), (153, 0, 0), (154, 0, 0), (148, 0, 0), (139, 0, 0), (125, 0, 0), (109, 0, 0), (95, 0, 0), (81, 0, 0), (69, 0, 0), (71, 0, 0), (70, 0, 0), (100, 0, 0), (111, 0, 0), (143, 0, 0), (174, 0, 0), (175, 0, 0), (139, 0, 0), (81, 0, 0), (58, 0, 0), (148, 0, 0), (215, 0, 0), (226, 0, 0), (193, 0, 0), (162, 0, 0), (77, 0, 0), (70, 0, 0), (124, 0, 0), (193, 0, 0), (199, 0, 0), (107, 0, 0), (185, 0, 0), (177, 0, 0), (174, 0, 0), (206, 0, 0), (228, 0, 0), (251, 0, 0), (91, 0, 0), (131, 0, 0), (102, 0, 0), (93, 0, 0), (97, 0, 0), (92, 0, 0), (102, 0, 0), (100, 0, 0), (111, 0, 0), (131, 0, 0), (149, 0, 0), (162, 0, 0), (163, 0, 0), (164, 0, 0), (163, 0, 0), (160, 0, 0), (150, 0, 0), (135, 0, 0), (119, 0, 0), (103, 0, 0), (91, 0, 0), (80, 0, 0), (72, 0, 0), (70, 0, 0), (69, 0, 0), (83, 0, 0), (124, 0, 0), (143, 0, 0), (156, 0, 0), (140, 0, 0), (71, 0, 0), (85, 0, 0), (156, 0, 0), (240, 0, 0), (255, 0, 0), (255, 0, 0), (222, 0, 0), (84, 0, 0), (138, 0, 0), (50, 0, 0), (10, 0, 0), (103, 0, 0), (121, 0, 0), (164, 0, 0), (116, 0, 0), (142, 0, 0), (229, 0, 0), (231, 0, 0), (100, 0, 0), (57, 0, 0), (96, 0, 0), (85, 0, 0), (98, 0, 0), (95, 0, 0), (102, 0, 0), (98, 0, 0), (97, 0, 0), (103, 0, 0), (116, 0, 0), (137, 0, 0), (154, 0, 0), (166, 0, 0), (173, 0, 0), (171, 0, 0), (168, 0, 0), (161, 0, 0), (148, 0, 0), (130, 0, 0), (109, 0, 0), (90, 0, 0), (82, 0, 0), (78, 0, 0), (73, 0, 0), (67, 0, 0), (68, 0, 0), (76, 0, 0), (121, 0, 0), (153, 0, 0), (137, 0, 0), (95, 0, 0), (88, 0, 0), (204, 0, 0), (246, 0, 0), (255, 0, 0), (255, 0, 0), (255, 0, 0), (230, 0, 0), (195, 0, 0), (126, 0, 0), (137, 0, 0), (142, 0, 0), (99, 0, 0), (129, 0, 0), (124, 0, 0), (53, 0, 0), (183, 0, 0), (115, 0, 0), (22, 0, 0), (35, 0, 0), (37, 0, 0), (106, 0, 0), (59, 0, 0), (110, 0, 0), (94, 0, 0), (95, 0, 0), (97, 0, 0), (96, 0, 0), (104, 0, 0), (120, 0, 0), (137, 0, 0), (152, 0, 0), (167, 0, 0), (179, 0, 0), (177, 0, 0), (169, 0, 0), (157, 0, 0), (142, 0, 0), (120, 0, 0), (97, 0, 0), (79, 0, 0), (73, 0, 0), (72, 0, 0), (74, 0, 0), (65, 0, 0), (67, 0, 0), (92, 0, 0), (112, 0, 0), (114, 0, 0), (145, 0, 0), (131, 0, 0), (214, 0, 0), (250, 0, 0), (255, 0, 0), (255, 0, 0), (255, 0, 0), (222, 0, 0), (98, 0, 0), (159, 0, 0), (243, 0, 0), (252, 0, 0), (195, 0, 0), (123, 0, 0), (125, 0, 0), (243, 0, 0), (157, 0, 0), (136, 0, 0), (0, 0, 0), (24, 0, 0), (37, 0, 0), (44, 0, 0), (46, 0, 0), (91, 0, 0), (95, 0, 0), (83, 0, 0), (88, 0, 0), (94, 0, 0), (89, 0, 0), (115, 0, 0), (126, 0, 0), (130, 0, 0), (138, 0, 0), (155, 0, 0), (168, 0, 0), (174, 0, 0), (174, 0, 0), (161, 0, 0), (140, 0, 0), (109, 0, 0), (80, 0, 0), (60, 0, 0), (56, 0, 0), (61, 0, 0), (65, 0, 0), (53, 0, 0), (58, 0, 0), (98, 0, 0), (101, 0, 0), (120, 0, 0), (148, 0, 0), (186, 0, 0), (251, 0, 0), (253, 0, 0), (254, 0, 0), (255, 0, 0), (246, 0, 0), (32, 0, 0), (231, 0, 0), (242, 0, 0), (230, 0, 0), (243, 0, 0), (254, 0, 0), (237, 0, 0), (250, 0, 0), (208, 0, 0), (95, 0, 0), (8, 0, 0), (0, 0, 0), (7, 0, 0), (31, 0, 0), (42, 0, 0), (36, 0, 0), (77, 0, 0), (62, 0, 0), (92, 0, 0), (107, 0, 0), (107, 0, 0), (110, 0, 0), (113, 0, 0), (121, 0, 0), (127, 0, 0), (137, 0, 0), (155, 0, 0), (166, 0, 0), (169, 0, 0), (163, 0, 0), (148, 0, 0), (124, 0, 0), (96, 0, 0), (77, 0, 0), (64, 0, 0), (59, 0, 0), (59, 0, 0), (59, 0, 0), (57, 0, 0), (64, 0, 0), (95, 0, 0), (96, 0, 0), (119, 0, 0), (76, 0, 0), (198, 0, 0), (245, 0, 0), (255, 0, 0), (252, 0, 0), (240, 0, 0), (54, 0, 0), (103, 0, 0), (248, 0, 0), (232, 0, 0), (221, 0, 0), (218, 0, 0), (226, 0, 0), (235, 0, 0), (129, 0, 0), (0, 0, 0), (43, 0, 0), (40, 0, 0), (1, 0, 0), (3, 0, 0), (14, 0, 0), (33, 0, 0), (45, 0, 0), (48, 0, 0), (71, 0, 0), (93, 0, 0), (111, 0, 0), (117, 0, 0), (121, 0, 0), (119, 0, 0), (118, 0, 0), (119, 0, 0), (132, 0, 0), (147, 0, 0), (158, 0, 0), (162, 0, 0), (153, 0, 0), (135, 0, 0), (112, 0, 0), (90, 0, 0), (81, 0, 0), (76, 0, 0), (72, 0, 0), (68, 0, 0), (69, 0, 0), (79, 0, 0), (89, 0, 0), (65, 0, 0), (86, 0, 0), (137, 0, 0), (82, 0, 0), (188, 0, 0), (252, 0, 0), (255, 0, 0), (249, 0, 0), (224, 0, 0), (102, 0, 0), (35, 0, 0), (185, 0, 0), (242, 0, 0), (204, 0, 0), (234, 0, 0), (201, 0, 0), (191, 0, 0), (0, 0, 0), (8, 0, 0), (1, 0, 0), (58, 0, 0), (0, 0, 0), (8, 0, 0), (18, 0, 0), (25, 0, 0), (23, 0, 0), (48, 0, 0), (88, 0, 0), (102, 0, 0), (109, 0, 0), (118, 0, 0), (116, 0, 0), (129, 0, 0), (121, 0, 0), (120, 0, 0), (130, 0, 0), (141, 0, 0), (149, 0, 0), (153, 0, 0), (146, 0, 0), (131, 0, 0), (112, 0, 0), (97, 0, 0), (89, 0, 0), (86, 0, 0), (81, 0, 0), (81, 0, 0), (87, 0, 0), (91, 0, 0), (102, 0, 0), (49, 0, 0), (47, 0, 0), (100, 0, 0), (153, 0, 0), (209, 0, 0), (253, 0, 0), (255, 0, 0), (245, 0, 0), (227, 0, 0), (96, 0, 0), (30, 0, 0), (18, 0, 0), (48, 0, 0), (37, 0, 0), (87, 0, 0), (218, 0, 0), (52, 0, 0), (0, 0, 0), (20, 0, 0), (3, 0, 0), (18, 0, 0), (1, 0, 0), (4, 0, 0), (16, 0, 0), (21, 0, 0), (44, 0, 0), (30, 0, 0), (137, 0, 0), (107, 0, 0), (94, 0, 0), (107, 0, 0), (120, 0, 0), (134, 0, 0), (127, 0, 0), (125, 0, 0), (135, 0, 0), (144, 0, 0), (149, 0, 0), (153, 0, 0), (145, 0, 0), (133, 0, 0), (118, 0, 0), (101, 0, 0), (94, 0, 0), (89, 0, 0), (82, 0, 0), (83, 0, 0), (93, 0, 0), (100, 0, 0), (111, 0, 0), (80, 0, 0), (85, 0, 0), (106, 0, 0), (198, 0, 0), (188, 0, 0), (242, 0, 0), (255, 0, 0), (253, 0, 0), (233, 0, 0), (94, 0, 0), (50, 0, 0), (29, 0, 0), (0, 0, 0), (9, 0, 0), (11, 0, 0), (29, 0, 0), (32, 0, 0), (2, 0, 0), (9, 0, 0), (11, 0, 0), (5, 0, 0), (43, 0, 0), (17, 0, 0), (23, 0, 0), (22, 0, 0), (18, 0, 0), (30, 0, 0), (90, 0, 0), (79, 0, 0), (93, 0, 0), (113, 0, 0), (129, 0, 0), (131, 0, 0), (128, 0, 0), (126, 0, 0), (137, 0, 0), (148, 0, 0), (155, 0, 0), (157, 0, 0), (148, 0, 0), (129, 0, 0), (111, 0, 0), (94, 0, 0), (91, 0, 0), (93, 0, 0), (86, 0, 0), (83, 0, 0), (89, 0, 0), (97, 0, 0), (106, 0, 0), (79, 0, 0), (67, 0, 0), (103, 0, 0), (135, 0, 0), (169, 0, 0), (233, 0, 0), (247, 0, 0), (243, 0, 0), (229, 0, 0), (114, 0, 0), (51, 0, 0), (26, 0, 0), (16, 0, 0), (29, 0, 0), (43, 0, 0), (4, 0, 0), (18, 0, 0), (0, 0, 0), (1, 0, 0), (18, 0, 0), (24, 0, 0), (11, 0, 0), (3, 0, 0), (15, 0, 0), (13, 0, 0), (7, 0, 0), (70, 0, 0), (32, 0, 0), (21, 0, 0), (31, 0, 0), (64, 0, 0), (137, 0, 0), (122, 0, 0), (126, 0, 0), (128, 0, 0), (137, 0, 0), (153, 0, 0), (162, 0, 0), (160, 0, 0), (148, 0, 0), (123, 0, 0), (106, 0, 0), (88, 0, 0), (87, 0, 0), (93, 0, 0), (87, 0, 0), (79, 0, 0), (81, 0, 0), (88, 0, 0), (95, 0, 0), (75, 0, 0), (23, 0, 0), (45, 0, 0), (109, 0, 0), (174, 0, 0), (198, 0, 0), (248, 0, 0), (255, 0, 0), (240, 0, 0), (135, 0, 0), (84, 0, 0), (45, 0, 0), (55, 0, 0), (0, 0, 0), (12, 0, 0), (5, 0, 0), (18, 0, 0), (0, 0, 0), (1, 0, 0), (8, 0, 0), (10, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (87, 0, 0), (67, 0, 0), (42, 0, 0), (81, 0, 0), (60, 0, 0), (0, 0, 0), (108, 0, 0), (120, 0, 0), (127, 0, 0), (139, 0, 0), (157, 0, 0), (164, 0, 0), (157, 0, 0), (143, 0, 0), (126, 0, 0), (111, 0, 0), (92, 0, 0), (87, 0, 0), (87, 0, 0), (77, 0, 0), (66, 0, 0), (69, 0, 0), (66, 0, 0), (71, 0, 0), (21, 0, 0), (42, 0, 0), (81, 0, 0), (124, 0, 0), (90, 0, 0), (163, 0, 0), (202, 0, 0), (238, 0, 0), (255, 0, 0), (228, 0, 0), (202, 0, 0), (123, 0, 0), (46, 0, 0), (72, 0, 0), (0, 0, 0), (17, 0, 0), (35, 0, 0), (0, 0, 0), (6, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (73, 0, 0), (66, 0, 0), (50, 0, 0), (48, 0, 0), (55, 0, 0), (102, 0, 0), (133, 0, 0), (0, 0, 0), (95, 0, 0), (126, 0, 0), (134, 0, 0), (151, 0, 0), (154, 0, 0), (154, 0, 0), (144, 0, 0), (126, 0, 0), (119, 0, 0), (100, 0, 0), (91, 0, 0), (66, 0, 0), (53, 0, 0), (56, 0, 0), (48, 0, 0), (51, 0, 0), (49, 0, 0), (16, 0, 0), (19, 0, 0), (43, 0, 0), (53, 0, 0), (59, 0, 0), (72, 0, 0), (193, 0, 0), (239, 0, 0), (189, 0, 0), (218, 0, 0), (225, 0, 0), (181, 0, 0), (135, 0, 0), (83, 0, 0), (53, 0, 0), (95, 0, 0), (51, 0, 0), (76, 0, 0), (147, 0, 0), (92, 0, 0), (77, 0, 0), (46, 0, 0), (1, 0, 0), (0, 0, 0), (54, 0, 0), (83, 0, 0), (57, 0, 0), (66, 0, 0), (81, 0, 0), (40, 0, 0), (68, 0, 0), (72, 0, 0), (137, 0, 0), (0, 0, 0), (117, 0, 0), (141, 0, 0), (158, 0, 0), (155, 0, 0), (145, 0, 0), (135, 0, 0), (118, 0, 0), (103, 0, 0), (85, 0, 0), (80, 0, 0), (65, 0, 0), (61, 0, 0), (58, 0, 0), (52, 0, 0), (49, 0, 0), (47, 0, 0), (2, 0, 0), (14, 0, 0), (17, 0, 0), (10, 0, 0), (8, 0, 0), (99, 0, 0), (130, 0, 0), (235, 0, 0), (246, 0, 0), (209, 0, 0), (236, 0, 0), (242, 0, 0), (204, 0, 0), (209, 0, 0), (220, 0, 0), (250, 0, 0), (158, 0, 0), (185, 0, 0), (154, 0, 0), (78, 0, 0), (69, 0, 0), (61, 0, 0), (0, 0, 0), (10, 0, 0), (90, 0, 0), (46, 0, 0), (42, 0, 0), (75, 0, 0), (69, 0, 0), (65, 0, 0), (53, 0, 0), (66, 0, 0), (58, 0, 0), (94, 0, 0), (0, 0, 0), (142, 0, 0), (165, 0, 0), (165, 0, 0), (157, 0, 0), (127, 0, 0), (110, 0, 0), (92, 0, 0), (87, 0, 0), (91, 0, 0), (89, 0, 0), (95, 0, 0), (91, 0, 0), (88, 0, 0), (79, 0, 0), (78, 0, 0), (5, 0, 0), (8, 0, 0), (8, 0, 0), (6, 0, 0), (8, 0, 0), (84, 0, 0), (137, 0, 0), (143, 0, 0), (162, 0, 0), (199, 0, 0), (240, 0, 0), (242, 0, 0), (254, 0, 0), (255, 0, 0), (246, 0, 0), (246, 0, 0), (241, 0, 0), (144, 0, 0), (83, 0, 0), (71, 0, 0), (66, 0, 0), (6, 0, 0), (0, 0, 0), (95, 0, 0), (69, 0, 0), (60, 0, 0), (69, 0, 0), (76, 0, 0), (67, 0, 0), (74, 0, 0), (84, 0, 0), (83, 0, 0), (54, 0, 0), (77, 0, 0), (99, 0, 0), (0, 0, 0), (175, 0, 0), (162, 0, 0), (154, 0, 0), (148, 0, 0), (119, 0, 0), (98, 0, 0), (97, 0, 0), (108, 0, 0), (111, 0, 0), (117, 0, 0), (117, 0, 0), (116, 0, 0), (110, 0, 0), (109, 0, 0), (0, 0, 0), (6, 0, 0), (11, 0, 0), (2, 0, 0), (0, 0, 0), (51, 0, 0), (129, 0, 0), (147, 0, 0), (148, 0, 0), (149, 0, 0), (179, 0, 0), (229, 0, 0), (240, 0, 0), (249, 0, 0), (255, 0, 0), (255, 0, 0), (255, 0, 0), (219, 0, 0), (62, 0, 0), (81, 0, 0), (65, 0, 0), (71, 0, 0), (71, 0, 0), (80, 0, 0), (75, 0, 0), (76, 0, 0), (61, 0, 0), (58, 0, 0), (47, 0, 0), (43, 0, 0), (83, 0, 0), (64, 0, 0), (42, 0, 0), (49, 0, 0), (57, 0, 0), (99, 0, 0), (29, 0, 0), (165, 0, 0), (155, 0, 0), (155, 0, 0), (142, 0, 0), (118, 0, 0), (110, 0, 0), (120, 0, 0), (123, 0, 0), (122, 0, 0), (127, 0, 0), (126, 0, 0), (123, 0, 0), (124, 0, 0), (0, 0, 0), (1, 0, 0), (7, 0, 0), (0, 0, 0), (0, 0, 0), (58, 0, 0), (150, 0, 0), (195, 0, 0), (170, 0, 0), (192, 0, 0), (252, 0, 0), (255, 0, 0), (255, 0, 0), (236, 0, 0), (244, 0, 0), (251, 0, 0), (242, 0, 0), (255, 0, 0), (119, 0, 0), (100, 0, 0), (72, 0, 0), (22, 0, 0), (63, 0, 0), (77, 0, 0), (89, 0, 0), (81, 0, 0), (53, 0, 0), (62, 0, 0), (45, 0, 0), (54, 0, 0), (62, 0, 0), (61, 0, 0), (89, 0, 0), (62, 0, 0), (60, 0, 0), (37, 0, 0), (79, 0, 0), (0, 0, 0), (164, 0, 0), (134, 0, 0), (131, 0, 0), (116, 0, 0), (112, 0, 0), (121, 0, 0), (120, 0, 0), (113, 0, 0), (123, 0, 0), (127, 0, 0), (120, 0, 0), (122, 0, 0), (0, 0, 0), (7, 0, 0), (1, 0, 0), (0, 0, 0), (0, 0, 0), (72, 0, 0), (201, 0, 0), (255, 0, 0), (241, 0, 0), (213, 0, 0), (215, 0, 0), (254, 0, 0), (246, 0, 0), (239, 0, 0), (241, 0, 0), (242, 0, 0), (221, 0, 0), (255, 0, 0), (215, 0, 0), (77, 0, 0), (82, 0, 0), (41, 0, 0), (45, 0, 0), (64, 0, 0), (47, 0, 0), (76, 0, 0), (74, 0, 0), (65, 0, 0), (61, 0, 0), (47, 0, 0), (48, 0, 0), (54, 0, 0), (89, 0, 0), (85, 0, 0), (57, 0, 0), (42, 0, 0), (27, 0, 0), (56, 0, 0), (25, 0, 0), (153, 0, 0), (115, 0, 0), (105, 0, 0), (107, 0, 0), (109, 0, 0), (105, 0, 0), (101, 0, 0), (110, 0, 0), (120, 0, 0), (113, 0, 0), (116, 0, 0), (15, 0, 0), (7, 0, 0), (0, 0, 0), (0, 0, 0), (6, 0, 0), (60, 0, 0), (161, 0, 0), (217, 0, 0), (222, 0, 0), (200, 0, 0), (192, 0, 0), (226, 0, 0), (255, 0, 0), (255, 0, 0), (255, 0, 0), (255, 0, 0), (248, 0, 0), (255, 0, 0), (255, 0, 0), (111, 0, 0), (26, 0, 0), (64, 0, 0), (31, 0, 0), (41, 0, 0), (51, 0, 0), (42, 0, 0), (89, 0, 0), (83, 0, 0), (51, 0, 0), (27, 0, 0), (55, 0, 0), (52, 0, 0), (43, 0, 0), (72, 0, 0), (86, 0, 0), (86, 0, 0), (45, 0, 0), (57, 0, 0), (45, 0, 0), (62, 0, 0), (112, 0, 0), (93, 0, 0), (89, 0, 0), (80, 0, 0), (76, 0, 0), (75, 0, 0), (79, 0, 0), (89, 0, 0), (85, 0, 0), (87, 0, 0), (0, 0, 0), (1, 0, 0), (6, 0, 0), (0, 0, 0), (0, 0, 0), (9, 0, 0), (41, 0, 0), (137, 0, 0), (163, 0, 0), (194, 0, 0), (211, 0, 0), (237, 0, 0), (238, 0, 0), (245, 0, 0), (250, 0, 0), (255, 0, 0), (255, 0, 0), (255, 0, 0), (255, 0, 0), (136, 0, 0), (98, 0, 0), (64, 0, 0), (80, 0, 0), (38, 0, 0), (51, 0, 0), (45, 0, 0), (72, 0, 0), (77, 0, 0), (63, 0, 0), (62, 0, 0), (54, 0, 0), (48, 0, 0), (46, 0, 0), (55, 0, 0), (62, 0, 0), (100, 0, 0), (79, 0, 0), (40, 0, 0), (107, 0, 0), (71, 0, 0), (51, 0, 0), (29, 0, 0), (57, 0, 0), (74, 0, 0), (57, 0, 0), (33, 0, 0), (28, 0, 0), (55, 0, 0), (49, 0, 0), (58, 0, 0), (0, 0, 0), (0, 0, 0), (3, 0, 0), (3, 0, 0), (0, 0, 0), (0, 0, 0), (16, 0, 0), (82, 0, 0), (144, 0, 0), (194, 0, 0), (226, 0, 0), (223, 0, 0), (212, 0, 0), (232, 0, 0), (255, 0, 0), (240, 0, 0), (255, 0, 0), (246, 0, 0), (255, 0, 0), (198, 0, 0), (105, 0, 0), (53, 0, 0), (66, 0, 0), (44, 0, 0), (45, 0, 0), (53, 0, 0), (62, 0, 0), (75, 0, 0), (56, 0, 0), (69, 0, 0), (70, 0, 0), (43, 0, 0), (53, 0, 0), (67, 0, 0), (46, 0, 0), (65, 0, 0), (56, 0, 0), (63, 0, 0), (42, 0, 0), (109, 0, 0), (31, 0, 0), (77, 0, 0), (34, 0, 0), (58, 0, 0), (39, 0, 0), (18, 0, 0), (23, 0, 0), (42, 0, 0), (41, 0, 0), (47, 0, 0), (3, 0, 0), (2, 0, 0), (0, 0, 0), (5, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (21, 0, 0), (122, 0, 0), (160, 0, 0), (184, 0, 0), (212, 0, 0), (236, 0, 0), (214, 0, 0), (249, 0, 0), (246, 0, 0), (245, 0, 0), (239, 0, 0), (249, 0, 0), (255, 0, 0), (115, 0, 0), (89, 0, 0), (31, 0, 0), (79, 0, 0), (30, 0, 0), (47, 0, 0), (58, 0, 0), (63, 0, 0), (47, 0, 0), (41, 0, 0), (54, 0, 0), (48, 0, 0), (59, 0, 0), (63, 0, 0), (49, 0, 0), (48, 0, 0), (51, 0, 0), (68, 0, 0), (53, 0, 0), (66, 0, 0), (118, 0, 0), (17, 0, 0), (40, 0, 0), (34, 0, 0), (38, 0, 0), (31, 0, 0), (41, 0, 0), (49, 0, 0), (46, 0, 0), (50, 0, 0), (7, 0, 0), (4, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (22, 0, 0), (120, 0, 0), (179, 0, 0), (222, 0, 0), (228, 0, 0), (235, 0, 0), (255, 0, 0), (255, 0, 0), (252, 0, 0), (255, 0, 0), (249, 0, 0), (255, 0, 0), (195, 0, 0), (106, 0, 0), (65, 0, 0), (74, 0, 0), (65, 0, 0), (32, 0, 0), (53, 0, 0), (48, 0, 0), (42, 0, 0), (21, 0, 0), (69, 0, 0), (68, 0, 0), (50, 0, 0), (65, 0, 0), (52, 0, 0), (48, 0, 0), (57, 0, 0), (59, 0, 0), (63, 0, 0), (58, 0, 0), (80, 0, 0), (121, 0, 0), (96, 0, 0), (6, 0, 0), (36, 0, 0), (51, 0, 0), (45, 0, 0), (45, 0, 0), (50, 0, 0), (51, 0, 0), (4, 0, 0), (6, 0, 0), (4, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (21, 0, 0), (143, 0, 0), (155, 0, 0), (176, 0, 0), (208, 0, 0), (240, 0, 0), (255, 0, 0), (247, 0, 0), (248, 0, 0), (248, 0, 0), (253, 0, 0), (251, 0, 0), (122, 0, 0), (99, 0, 0), (48, 0, 0), (55, 0, 0), (41, 0, 0), (47, 0, 0), (35, 0, 0), (24, 0, 0), (28, 0, 0), (61, 0, 0), (75, 0, 0), (41, 0, 0), (75, 0, 0), (49, 0, 0), (69, 0, 0), (56, 0, 0), (60, 0, 0), (74, 0, 0), (43, 0, 0), (71, 0, 0), (60, 0, 0), (87, 0, 0), (29, 0, 0), (29, 0, 0), (54, 0, 0), (46, 0, 0), (41, 0, 0), (49, 0, 0), (46, 0, 0), (1, 0, 0), (3, 0, 0), (3, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (1, 0, 0), (0, 0, 0), (0, 0, 0), (2, 0, 0), (55, 0, 0), (135, 0, 0), (162, 0, 0), (178, 0, 0), (208, 0, 0), (250, 0, 0), (244, 0, 0), (251, 0, 0), (243, 0, 0), (250, 0, 0), (255, 0, 0), (140, 0, 0), (100, 0, 0), (72, 0, 0), (22, 0, 0), (73, 0, 0), (39, 0, 0), (15, 0, 0), (35, 0, 0), (36, 0, 0), (36, 0, 0), (41, 0, 0), (54, 0, 0), (73, 0, 0), (62, 0, 0), (68, 0, 0), (80, 0, 0), (38, 0, 0), (63, 0, 0), (60, 0, 0), (62, 0, 0), (51, 0, 0), (36, 0, 0), (65, 0, 0), (14, 0, 0), (37, 0, 0), (41, 0, 0), (27, 0, 0), (36, 0, 0), (31, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (4, 0, 0), (5, 0, 0), (3, 0, 0), (1, 0, 0), (3, 0, 0), (1, 0, 0), (0, 0, 0), (0, 0, 0), (40, 0, 0), (133, 0, 0), (141, 0, 0), (181, 0, 0), (226, 0, 0), (249, 0, 0), (249, 0, 0), (246, 0, 0), (250, 0, 0), (255, 0, 0), (192, 0, 0), (96, 0, 0), (99, 0, 0), (69, 0, 0), (42, 0, 0), (61, 0, 0), (36, 0, 0), (29, 0, 0), (39, 0, 0), (42, 0, 0), (21, 0, 0), (37, 0, 0), (83, 0, 0), (18, 0, 0), (87, 0, 0), (87, 0, 0), (56, 0, 0), (60, 0, 0), (46, 0, 0), (48, 0, 0), (39, 0, 0), (55, 0, 0), (107, 0, 0), (90, 0, 0), (0, 0, 0), (30, 0, 0), (23, 0, 0), (32, 0, 0), (26, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (7, 0, 0), (7, 0, 0), (4, 0, 0), (2, 0, 0), (6, 0, 0), (10, 0, 0), (1, 0, 0), (0, 0, 0), (5, 0, 0), (57, 0, 0), (133, 0, 0), (142, 0, 0), (203, 0, 0), (246, 0, 0), (246, 0, 0), (255, 0, 0), (255, 0, 0), (255, 0, 0), (246, 0, 0), (161, 0, 0), (97, 0, 0), (99, 0, 0), (58, 0, 0), (4, 0, 0), (64, 0, 0), (50, 0, 0), (43, 0, 0), (24, 0, 0), (21, 0, 0), (45, 0, 0), (64, 0, 0), (0, 0, 0), (84, 0, 0), (97, 0, 0), (48, 0, 0), (56, 0, 0), (46, 0, 0), (45, 0, 0), (50, 0, 0), (61, 0, 0), (63, 0, 0), (115, 0, 0), (6, 0, 0), (27, 0, 0), (70, 0, 0), (68, 0, 0), (62, 0, 0), (0, 0, 0), (0, 0, 0), (3, 0, 0), (4, 0, 0), (3, 0, 0), (1, 0, 0), (1, 0, 0), (6, 0, 0), (8, 0, 0), (6, 0, 0), (0, 0, 0), (1, 0, 0), (11, 0, 0), (63, 0, 0), (127, 0, 0), (128, 0, 0), (176, 0, 0), (245, 0, 0), (255, 0, 0), (252, 0, 0), (254, 0, 0), (250, 0, 0), (251, 0, 0), (115, 0, 0), (101, 0, 0), (90, 0, 0), (55, 0, 0), (35, 0, 0), (49, 0, 0), (29, 0, 0), (25, 0, 0), (28, 0, 0), (40, 0, 0), (40, 0, 0), (19, 0, 0), (10, 0, 0), (17, 0, 0), (43, 0, 0), (66, 0, 0), (25, 0, 0), (40, 0, 0), (52, 0, 0), (81, 0, 0), (38, 0, 0), (68, 0, 0), (80, 0, 0), (51, 0, 0), (120, 0, 0), (101, 0, 0), (93, 0, 0)]
  1. Remplacez les lignes 6 à 9 du programme précédent afin que le tableau new_pixels soit créé par compréhension.
In [9]:
from PIL import Image # on importe le module Image de la bibliothèque PIL
img = Image.open("perroquet.jpg")
pixels = list(img.getdata()) 
display(img)

# TRANSFORMATION DE L'IMAGE
# ---------------
# à compléter
# ---------------

img.putdata(new_pixels) # on copie cette nouvelle liste de pixels dans les données de 'img'

# RESULTAT
display(img) # on affiche l'image 'img' ainsi transformée
img.close() # on ferme le flux
  1. En vous inspirant de ce qui vient d'être fait, écrivez un programme permettant d'appliquer un filtre vert à l'image "perroquet.jpg".
In [ ]:
 
  1. En vous inspirant de ce qui vient d'être fait, écrivez un programme permettant d'appliquer un filtre cyan à l'image "perroquet.jpg".
In [ ]:
 

Ressources :

  • Documents ressources du DIU EIL Nantes
  • Spécialité NSI 1re, T. BALABONSKI, S. CONCHON, J.-C. FILLIATRE, K. NGUYEN, éditions ELLIPSES

Germain BECKER & Sébastien POINT, Lycée Mounier, ANGERS Licence Creative Commons