Carré magique🔗
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #!/usr/bin/env python3
# coding: utf-8
# Time-stamp: <2020-08-05 11:48 ycopin@lyonovae03>
"""
Création et affichage d'un carré magique d'ordre impair.
"""
__author__ = "Yannick Copin <y.copin@ipnl.in2p3.fr>"
n = 5 # Ordre du carré magique
# On vérifie que l'ordre est bien impair
assert n % 2 == 1, f"L'ordre {n} n'est pas impair."
# Le carré sera stocké dans une liste de n listes de n entiers
# Initialisation du carré: liste de n listes de n zéros.
array = [[0 for j in range(n)] for i in range(n)]
# Initialisation de l'algorithme
i, j = n, (n + 1) // 2 # Indices de l'algo (1-indexation)
array[i - 1][j - 1] = 1 # Attention: python utilise une 0-indexation
# Boucle sur valeurs restant à inclure dans le carré (de 2 à n**2)
for k in range(2, n**2 + 1):
# Test de la case i+1, j+1 (modulo n)
i2 = (i + 1) % n
j2 = (j + 1) % n
if array[i2 - 1][j2 - 1] == 0: # La case est vide: l'utiliser
i, j = i2, j2
# La case est déjà remplie: utiliser la case i-1, j
else:
i = (i - 1) % n
array[i - 1][j - 1] = k # Remplissage de la case
# Affichage, avec vérification des sommes par ligne et par colonne
print(f"Carré magique d'ordre {n}:")
for row in array:
print(' '.join(f'{k:2d}' for k in row), '=', sum(row))
print(' '.join('==' for k in row))
print(' '.join(str(sum(array[i][j] for i in range(n))) for j in range(n)))
|
$ python3 carre.py
Carré magique d'ordre 5:
11 18 25 2 9 = 65
10 12 19 21 3 = 65
4 6 13 20 22 = 65
23 5 7 14 16 = 65
17 24 1 8 15 = 65
== == == == ==
65 65 65 65 65
Source: carre.py