Table des matières

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

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 !

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 :

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 :

<code python> content = '\n'.join(result) # recolle les lignes f = open(filename, 'w', encoding='utf8') f.write(content) f.close()