TD J3 : numpy / listes et jeu de labyrinthe¶
Dans cet exercice on considère un jeu de labyrinthe, dont le plateau sera modélisé par un tableau à deux dimensions avec 10 colonnes et 6 lignes. Les cases du labyrinthe peuvent être de trois types~:
- les cases vides, notées
V; - les murs, notés
M; - les cases spéciales, notées
Dpour la case de départ etApour la case d'arrivée.
Partie 1 : initialisation du plateau¶
L'objectif de cette partie est d'initialiser le plateau de jeu avec une configuration simple. On va procéder étape par étape pour obtenir le plateau représenté en étape 4:
Q1. Dans la cellule ci-dessous on a placé une commande qui crée un tableau numpy nommé plateau. Celui-ci est vide, de la taille demandée (10x6) et dont toutes les cases seront des chaînes de caractères.
Compléter progressivement cette cellule par les commandes (à base de slices) qui permettent d'obtenir la plateau de la configuration de l'étape 4.
import numpy as np
plateau = np.empty((5,10), dtype=str) # tableau 5x10 de type str
# Étape 1
# À compléter
# Étape 2
# À compléter
# Étape 3
# À compléter
# Étape 4
# À compléter
print(plateau)
[['' '' '' '' '' '' '' '' '' ''] ['' '' '' '' '' '' '' '' '' ''] ['' '' '' '' '' '' '' '' '' ''] ['' '' '' '' '' '' '' '' '' ''] ['' '' '' '' '' '' '' '' '' '']]
Partie 2 : compression¶
Dans cette partie on souhaite maintenant compresser le stockage de notre plateau. Dans l'état actuel, si chaque case est représentée par un octet (8 bits) il nécessite $10*6=60$ octets.
Afin de diminuer cette taille, on souhaite stocker tout le tableau dans une liste python construite de la façon suivante:
- Les deux premiers éléments sont le nombre de lignes, et de colonne du tableau (cette information est nécessaire pour reconstituer le tableau à partir de la liste),
- ensuite, les données se lisent par deux. La première est la valeur de la case (ici
M,V,AouD), et la deuxième le nombre de cases consécutives contenant cette valeur. Avec l'exemple précédent cela donnerait un liste qui commence ainsi:
lst_finale = [5,10,'M',10,'D',1,'V',8,'M',2,...]
On transforme le tableau 2D en liste 1D¶
Q2. Compléter la fonction D2toD1(tab) -> list qui reçoit un tableau numpy qui représente le plateau de jeu et qui renvoie une liste python obtenue en concaténant toutes les lignes du tableau. Par exemple, avec le plateau de cet exercice le début de la liste obtenue doit être :
def D2toD1(tab : np.array)-> list:
n_lig, n_col = np.shape(tab)
lst = []
# à compléter
return lst
On comprime la liste 1D en deux listes 1D¶
Q3. La fonction compress(lst : list) -> (list,list) reçoit une liste telle que celle obtenu en question précédente, et renvoie deux listes. La première contient les valeurs et l'autre les effectifs correspondants. Par exemple avec la liste précédente on devrait obtenir deux listes qui commencent par:
values = ['M','D','V',...] et counts = [10,1,8,...]
On donne ci-dessous le code partiel de cette fonction. À vous de compléter les zones 1 à 4 manquantes:
def compress(lst : list) -> (list,list):
car = lst.pop(0)
values = [car]
counts = [1]
while # Zone 1
car = lst.pop(0)
if car == value[-1]:
# Zone 2
else:
# Zone 3
# Zone 4
return values, counts
On assemble les deux listes pour finaliser¶
Q4. Écrire alors une fonction comp_final(tableau : np.array) -> list qui reçoit un tableau numpy représentant un plateau de jeu et qui renvoie une liste telle que demandée dans l'énoncé.
Q5. Déterminer la liste finale obtenue dans l'exemple de l'exercice, donner son nombre d'éléments et voir si on a bien diminué la taille...
Partie 3 : décompression¶
Q6. Écrire pour finir une fonction decompression(lst : list)-> np.array qui reçoit une liste issue de la compression d'un tableau telle celle obtenue à la questyion précédente, et qui renvoie le tableau numpy initial associé.