====== Système d'affichage ======
===== Fichier alphabet =====
Vous connaissez les grands afficheurs de gare ou d'aéroport qui affichent les lettres avec de gros pixels. Nous voulons automatiser ce principe.
Par exemple, on voudrait afficher le ''A'' de cette façon :
■■■
■ ■
■■■■■
■ ■
■ ■
On écrira donc l'affichage du ''A'' dans un fichier texte. Mais on ne souhaite pas utiliser plusieurs fichiers pour tout l'alphabet, alors on place toutes les lettres ''A-Z'' dans le même fichier texte, à la suite, en ajoutant un caractère joker.
■■■
■ ■
■■■■■
■ ■
■ ■
■■■■
■ ■
■■■■
■ ■
■■■■
■■■■
■
■
■
■■■■
etc.
■■■■■
■
■
■
■■■■■
■■■
■ ■
■
■
■
On sait qu'il y aura toujours exactement 27 caractères (lettres plus joker) et que toutes les lettres utilisent le même nombre de pixels horizontalement et verticalement.
Le joker est utilisé chaque fois que l'on rencontre un caractère non prévu.
===== Affichage =====
On se donne un message composé de majuscules sans accent et d'espaces. On souhaite afficher le message en utilisant l'alphabet donné dans le fichier.
Par exemple, le message ''%%"BONJOUR"%%'' donnerait la réponse :
■■■■ ■■■ ■ ■ ■■■■■ ■■■ ■ ■ ■■■■
■ ■ ■ ■ ■■ ■ ■ ■ ■ ■ ■ ■ ■
■■■■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■■■■
■ ■ ■ ■ ■ ■■ ■ ■ ■ ■ ■ ■ ■ ■
■■■■ ■■■ ■ ■ ■■ ■■■ ■■■ ■ ■
On souhaite écrire ce message dans un fichier texte.
===== À faire =====
Écrire une fonction ''%%affichage(alphabet:str, message:str, dest:str)%%'' qui reçoit les arguments
* ''alphabet'', nom du fichier texte contenant l'alphabet
* ''message'', chaîne à représenter
* ''dest'', nom du fichier texte à créer
La fonction lit l'alphabet à utiliser, écrit le message en utilisant cet alphabet, écrit le résultat dans le fichier ''dest''.
Pour vos essais, vous pourrez utiliser le fichier {{ :nsi:tds:alphabet.txt |}} mais pensez à en créer d'autres !
===== Un peu d'aide =====
=== Ouvrir le fichier ===
f = open(filename, 'r', encoding='utf8')
content = f.read()
f.close()
lines = content.split('\n')
Suite à ce code, ''lines'' contient un tableau où chaque item est une ligne du fichier.
[' ■■■ ', '■ ■', '■■■■■', '■ ■', '■ ■', '■■■■ ', '■ ■', ..., '']
Vous remarquez que la dernière ligne est vide. Cela peut arriver mais n'est pas certain. Cela dépend de comment à été écrit le fichier. On peut s'assurer que la dernière ligne n'est pas vide en supprimant toute dernière ligne qui serait vide :
while lines[-1] == '':
lines.pop()
La fonction `pop`a pour effet d'enlever le dernier élément.
=== Accéder à une ligne ===
Maintenant que nous disposons de ''lines'', nous pouvons facilement consulter le contenu d'une ligne.
>>> lines[2]
'■■■■■'
=== Parcours caractères / lignes ===
Supposons que l'on veuille afficher ''%%"BONJOUR"%%''. On va devoir à un moment où à un autre récupérer l'affichage pour ''%%"B"%%'', pour ''%%"O"%%'', etc.
L'affichage de ''%%"B"%%'' (et des autres) se compose de ''n = 5'' lignes -- //C'est un exemple, cela pourrait être autre chose que 5 !.//
Donc première question : comment obtenir les lignes de l'affichage de ''%%"B"%%'' (par exemple) ? Et même mieux : comment obtenir chaque ligne de l'affichage de tel caractère (par exemple, la ligne 2 de B) ?
Quand vous aurez réglé cette question, il ne restera plus grand chose à faire. Vous devez donc réaliser cette fonction :
def get_car_line(car:str, line:int, alphabet:list) -> str:
'''
car: caractère demandé.
line: indice de la ligne d'affichage demandée
alphabet: tableau contenant l'alphabet
renvoie le contenu de alphabet correspondant au caractère demandé et à ligne d'affichage demandée
'''
Quelques remarques :
* Dans l'exemple, ''alphabet'' aurait la forme :\\
alphabet = [
' ■■■ ',
'■ ■',
'■■■■■',
'■ ■',
'■ ■',
'■■■■ ',
'■ ■',
'■■■■ ',
'■ ■',
'■■■■ ',
...
]
* Le caractère doit être un caractère dans A--Z. S'il n'y est pas on considère que l'on demande le joker. Il sera utile d'associer un indice à chaque caractère : A -> 0, B -> 1, ... Z -> 25 et pour les autres -> 26 (joker)
* Chaque caractère compte ''n'' lignes et l'alphabet a 27 caractères. ''alphabet'' compte donc exactement ''27 * n'' lignes et il est donc possible de déterminer ''n'' connaissant ''alphabet''.
* Évidemment, ''line'' devrait toujours vérifier ''%%0 <= line < n%%''
* Pour faire la fonction il faut raisonner ainsi : je demande la ligne 2 (''line == 2'') pour le caractère ''%%"B"%%'' (donc associé à un indice ''1'') et dans mon exemple je peux déterminer que ''n = 5''. quel est le numéro de la ligne demandée dans ''alphabet'' ? C'est la ligne 7, la fonction devrait renvoyer ''alphabet[7]'' dans ce cas.\\ Par quel calcul trouver ce 7 ?
Dernière chose, pour afficher le message (par exemple ''%%"BONJOUR"%%'', il faut énumérer les caractères du message et les lignes d'affichage (par exemple ici 5 lignes puisque chaque caractère a 5 pixels de haut). Comment articuler ces deux énumérations ?
=== Fichier de sortie ===
Supposons que vous ayez obtenu un résultat formé des 5 lignes de pixels pour écrire BONJOUR, dans une variable ''result''.
Il faut encore mettre les lignes ensemble et écrire dans un fichier :
content = '\n'.join(result) # recolle les lignes
f = open(filename, 'w', encoding='utf8')
f.write(content)
f.close()