L’art ASCII consiste à réaliser des images uniquement à l’aide des lettres et caractères spéciaux contenus dans le code ASCII.
Vous pouvez trouver des ASCII art simples sur le site ASCII art archive ou construire les votres à partir d’images et de ce générateur.
Pour cet exercice, vous devez utiliser en priorité le fichier
squelette python-07-tuples-artcode.py.
IMPORTANT : Enregistrez le avec
Right Click + Save Link As... pour conserver
l’encodage.
Selon la convention de structuration des modules, ce fichier sera structuré en quatre parties :
L’objectif est d’écrire une fonction artcode_i() mettant
en oeuvre un algorithme itératif de codage, c’est à dire de
transformation d’une image ASCII Art représentée par une chaine de
caractère en une représentation plus compacte :
Chaque tuple est composé d’un caractère (et d’un seul) et du nombre d’occurences consécutives de ce caractère. Par exemple :
MMMMaaacXolloMM[('M', 4), ('a', 3), ('c', 1), ('X', 1), ('o', 1), ('l', 2), ('o', 1), ('M', 2)].Vérifier le bon fonctionnement de la fonction en effectuant un appel
depuis main() et en affichant la valeur de retour pour
l’exemple ci dessus.
On peut construire un algorithme itératif sur la propriété suivante:
\(I(C, O, k)\) : \(C\) est la liste des caractères rencontrés lors du parcours de \(s[0:k]\) et \(O\) est la liste des occurrences correspondantes.
L’initialisation est directe :
Si \(n\) est la longueur de la chaîne \(s\) :
La progression, en supposant \(I(C, O, k)\) et \(\bar{A}\):
si le caractère courant est identique au caractère précédent, on augmente le nombre d’occurrences d’une unité:
SI s[k] = s[k-1]
ALORS O[-1] += 1sinon :
dans les deux cas, on progresse dans la chaîne : \(k = k+1\).
L’algorithme manipule deux listes distinctes (une liste de caractères et une liste d’occurrences) alors que la consigne est d’en retourner une seule formée de tuples dont le premier élément est pris dans \(C\) et le second dans \(O\). La fonction
zipréalise cette opération de façon très compacte.
Une fois la fonction opérationnelle pour quelques arguments, ET SEULEMENT DANS CE CAS, lancer les doctests dans un terminal.
$ python -m doctest exercice.py -v
La totalité des doctests doivent réussir.
Écrire une fonction artcode_r() mettant en oeuvre un
algorithme récursif de codage :
Vérifier le bon fonctionnement de la fonction en effectuant un appel
depuis main() et en affichant la valeur de retour (les
doctests de la fonction donnent des exemples d’appel et les valeurs de
retour correspondantes).
Pour l’écriture d’un algorithme récursif, il y a 2 questions essentielles qui structurent le raisonnement :
On peut penser à rechercher le nombre de caractères identiques au premier caractère de la chaîne passée en argument et recommencer l’opération sur la chaine restante. L’idée est de retourner une liste construite à partir du résultat ci dessus et d’un appel récursif.
Sur les listes, l’opérateur + permet de construire une
nouvelle liste constituée des deux opérandes. Cette façon de faire est à
privilégier. Attention, la méthode list.extend()
modifie la liste sur place.
Une fois la fonction opérationnelle pour quelques arguments, ET SEULEMENT DANS CE CAS, lancer les doctests dans un terminal.
$ python -m doctest exercice.py -v
La totalité des doctests doivent réussir.
Encoder les images contenues dans les variables globales
WWFet APPLE.