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.
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.
Écrire une fonction affichage(alphabet:str, message:str, dest:str) qui reçoit les arguments
alphabet, nom du fichier texte contenant l'alphabetmessage, chaîne à représenterdest, 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 alphabet.txt mais pensez à en créer d'autres !
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.
Maintenant que nous disposons de lines, nous pouvons facilement consulter le contenu d'une ligne.
>>> lines[2] '■■■■■'
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 :
alphabet aurait la forme :alphabet = [ ' ■■■ ', '■ ■', '■■■■■', '■ ■', '■ ■', '■■■■ ', '■ ■', '■■■■ ', '■ ■', '■■■■ ', ... ]
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.line devrait toujours vérifier 0 <= line < nline == 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.
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 ?
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 :
<code python> content = '\n'.join(result) # recolle les lignes f = open(filename, 'w', encoding='utf8') f.write(content) f.close()