C12.TD1 : Carrés magiques
Les carrés magiques
Définition
Un carré magique normal d’ordre n est un tableau carré de n lignes et n colonnes contenant les entiers de 1 à n², ces nombres étant disposés de sorte que leurs sommes sur chaque ligne, sur chaque colonne et sur chaque diagonale principale soient égales. La valeur de cette somme est nommée constante magique du carré et vaut n(n²+1)/2.
Choix d'une implémentation
On choisit d'implémenter un carré magique sous la forme d'une liste de liste.
Exemple : [[2, 7, 6], [6, 5, 1], [4, 3, 8]]
Vérification qu'une liste de listes est un carré magique
1) Vérification de la dimension du carre
On s'intéresse à la fonction suivante :
def est_de_bonne_dimension(carre):
n = len(carre)
for ligne in carre:
if len(ligne) != n:
return False
return True
Expliquer le code de cette fonction.
2) Vérification que le carré contient bien les nombres de 1 à n²
Écrire la fonction contient_1_a_n2(carre) qui prend un carré (une liste de listes) en paramètre et qui renvoie True si le carré contient bien les nombres de 1 à n², ou False dans le cas contraire.
On pourra pour cela :
- - récupérer toutes les valeurs du carré dans une liste et trier cette liste (voir le code ci-dessous) ;
- - créer une liste contenant les entiers de 1 à n² ;
- - comparer ces deux listes.
Complément : L'instruction li.sort() permet de trier les valeurs de la liste li.
3) Vérification de la somme des lignes, des colonnes et des diagonales
3.a) Écrire une fonction qui prend un carré en paramètre et renvoie True si toutes les lignes donnent des sommes égales à la constante magique du carré ou False dans le cas contraire.
3.b) Écrire une fonction qui prend un carré en paramètre et renvoie True si toutes les colonnes donnent des sommes égales à la constante magique du carré ou False dans le cas contraire.
3.c) Écrire une fonction qui prend un carré en paramètre et renvoie True si la sommes des valeurs de la diagonale descendante est égale à la constante magique du carré ou False dans le cas contraire.
3.d) Écrire une fonction qui prend un carré en paramètre et renvoie True si la sommes des valeurs de la diagonale ascendante est égale à la constante magique du carré ou False dans le cas contraire.
4) Bilan
En utilisant toutes les fonctions précédentes, écrire une fonction est_magique(carre) qui prend un carré en paramètre et renvoie True si c'est un carré magique ou False dans le cas contraire.
Affichage d'un carré magique
Proposer une fonction affiche(carre) qui prend un carré en paramètre et affiche proprement ce carré magique.
Création d'un carré magique d'ordre impair
Dans cette partie, on s'intéresse à la méthode dite "siamoise" de construction d'un carré magique normal d'ordre n pour n impair.
Voici la méthode :
- • Créer une liste de liste carrée de taille n, remplie de 0.
- • Placer le nombre 1 au milieu de la première ligne.
- • Se déplacer d'une case vers la droite puis d'une case vers le haut :
- - Si la case est en dehors du carré (soit au-dessus, soit à droite, soit les deux), se déplacer de l'autre côté du carré (soit en bas, soit à gauche, soit les deux).
- - Si la case est déjà occupée, revenir à la position précédente et se déplacer d'une case vers le bas.
- => Placer le nombre suivant dans la case.
- => Continuer ainsi jusqu'à avoir passé le nombre n².
Écrire une fonction creation_carre_magique(n) qui prend un nombre entier impair n en paramètre et renvoie une liste de liste correspondant un carré magique normal d'ordre n/