Carrés magiques normaux d'ordre n

Un carré magique normal d'ordre \(n\) est une grille carrée remplie de tous les entiers de \(1\) à \(n^2\), telle que les sommes suivantes sont égales :

  • la somme des nombres de chaque ligne,
  • la somme des nombres de chaque colonne,
  • la somme des nombres des deux diagonales.

Carré magique d'ordre \(3\)

🐍 Script Python
ex_ordre_3 = [
    [2, 7, 6],
    [9, 5, 1],
    [4, 3, 8],
]

Voici un exemple avec tous les entiers de \(1\) à \(9\).

  • la somme de chaque ligne est égale à \(15\)
    • \(2+7+6 = 15\)
    • \(9+5+1 = 15\)
    • \(4+3+8 = 15\)
  • la somme de chaque colonne est égale à \(15\) ;
    • \(2+9+4 = 15\)
    • \(7+5+3 = 15\)
    • \(6+1+8 = 15\)
  • la somme de chaque diagonale est égale à \(15\).
    • \(2+5+8 = 15\)
    • \(4+5+6 = 15\)

Carré magique d'ordre \(4\)

🐍 Script Python
ex_ordre_4 = [
    [16,  3,  2, 13],
    [ 5, 10, 11,  8],
    [ 9,  6,  7, 12],
    [ 4, 15, 14,  1],
]
Ce carré magique était connu du peintre allemand Albrecht Dürer, qui l'a inclus dans sa gravure Melencolia.

Écrire la fonction est_carre_magique qui prend en paramètre une grille carre et qui renvoie True si le carre est un carré magique normal, et False sinon.

On garantit que carre est un tableau 2D de forme carrée, rempli d'entiers ; il y a autant de lignes que de colonnes et toutes les lignes ont le même nombre de colonnes.

Exemples

🐍 Console Python
>>> ex_ordre_3 = [
...     [2, 7, 6],
...     [9, 5, 1],
...     [4, 3, 8],
... ]
>>> est_carre_magique(ex_ordre_3)
True
Les entiers de \(1\) à \(9\) sont disposés, avec une somme de 3 alignés égale à \(15\).

🐍 Console Python
>>> contre_ex_ordre_2 = [
...     [2, 2],
...     [2, 2],
... ]
>>> est_carre_magique(contre_ex_ordre_2)
False
Certes, toutes les sommes sont identiques, mais les entiers de \(1\) à \(4\) ne sont pas tous présents.

🐍 Console Python
>>> ex_ordre_4 = [
...     [16,  3,  2, 13],
...     [ 5, 10, 11,  8],
...     [ 9,  6,  7, 12],
...     [ 4, 15, 14,  1],
... ]
>>> est_carre_magique(ex_ordre_4)
True
Les entiers de \(1\) à \(16\) sont disposés, avec une somme de 4 alignés égale à \(34\).

Astuce

On peut obtenir la somme en commune :

  • soit en calculant la somme de la diagonale,
  • soit en utilisant la formule \(1+2+3+\cdots+n^2 = \dfrac{n^2(n^2+1)}{2}\).
###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10
.128013s3_8ufvy n7aS1me(P24:jtwi][h*)6o;bcdg/T0lqAp!.rF-,}=+k95R{é050K0q0x0m0z0P0b0j0J0P0m0b0b0!010x0z0S010406050b0f0p0p0m0V0i040n0G0P0f0 0G0k0j020m0p0S0H0j0)0q190V0Q0f0q0b050M16181a1c140S041A1H051K0M1K1M1H140K0z0h0@0_0{0}0C0z0L0C0P1!0C0x12050/0I0P0q1V0`0|011Z1#1%1#0x1-1/1+0x0I0G0K1c1,0V1I0x0C0@1f0b0S0m0k0}0t011;1X010g0;0q0k1n0q1+2c2e2j1?2m1/2p0p2r040a0j0s0V0G0S0G0b0z1i1k0-2a0V0V0q0J2M1A2t0k1I0M282Y0x2625270K2v0}1%0k2o2J1+1S1U0^1=2,0z2.0k221T1+0S2R1I2W2Y33152d1k2@2k2|0V190P120j0o2V3713362u391?3b3d3f0t3i2e3k2W2+013p0m3e040j0c3t2X143w3n0}3z3B0j0u3F3v373x3L3f0(3P3H3R3J3y0G3c3A3f0F3W3l381W3o3#3q3C0l3*3I3-3K3/3%3C0e3?3Y3^3!3$3M0%3~3m403T040o0O453,2^413:0o3h1B3j3X464e480o3s4j3u4l4d3a3`3B0o3E4r3G3+3S4w120o3O4A3Q4m4v424F3V4I4t4D4M493)4P4C3Z4o3=4V3@4n4E493}4!3 4$4S0o444*4K3.4S0t4b4:4u4=3:0t4i334Q4X4%0t4q4 4W47524z554#4L4|4H5a4+5c3{0t4O5f4;3_4?4U5l4`5n4|4Z5q4R4|4)5v514?4/5z574S0c4^5D4,3:0c4~4k565J3{0c545N5b4{5Q595T5g5V3B0c5e5Y5m4f5Q5k5(5r5*5#5p3j1J311A2=2#0K2)3x0J222B0,1T1I300q325=4I055~0-665)0$120-0g3P5O2k0y3f6i5U3K0g121y0x0d0J1a2R0d190L0z1w0q6n5Z0}11040r6E5)0k126v2Q6D686o016H0E0v3W0j6Y0j6j3o120k3P6!6S0G120!6)6#3K0I122y6K5.6H6J6R6F3y6N6w6Q356S6U6X6Z6:6~040b0G18713j6*6}6,046.4I7f6L6%6/6+120D7o6}6`6^3S7n7k777h7r7y6S6M046(7C7g120#7s5)0p0z4F7v3Z747H5)7h0M0M7L5.7N125S4s066Z7l5.0J0o12030j0x6s0j0-0?1`2.1z4P7)776e040g3#7Y7w040z833Z0G6l857G337*3S6=040V2e0L7d3u777u6|7m7F7Q406U6W7|7)767D127a7c0d867T5.7h7j8d770k8g1C8s4e8o726}7E6O2R8O2k6H0B8W6$858!6G120A8Z8p5.7E0w8%6T8)87407 810V8?4n128/8F3x89122`8{3a8g8i0k8k8:8Q5=8z8r8,3x6U0E758x8e3Z7 0z6h8 4X8A7b2A8D941?7h0T8I7e8K9s7c9a128v4 9k9k7~122R0x0f0V8c9B6S0$0J120W3A0b8l3G7(8y6}7,7.7:7=7@2a0P1j7`9j9l8@128_9w3K8}9`01918b9}8L9M8j9!6c6_126{8R8q9R8m73126V9=7}9d8B9u8~8J7p7ia18M179F6I8:8T70at8+aa8-92at8*av9|9f7R8=9q9@8082aK8|8$aO2k9 93aR3o96a4ata99c8S7xaA9gaf9i8w9K9T929pana$799t0q0dam9S7I049za19D2Aat9H4k9J8x9L8h0.9Pac2X9?4e9U9W9Ya5069$6Y779)047/7;0b0x7?1y7?0z0m0L1j3A1y9=9Ca?8C0K5M3ubdaS6-aq8AasaH8ta8aF048Ua58n12aza#8q8Ea(aI04aEbPaPb#bZa7b(9}8^aNa;b!9}aTbb3C8KaX98bVaeaub*3aa%b-a)040Ea+9I9%6da/a bE9ubGb^12a~aV9{cfb 7t9Gahcb5.7 9Nbab:9V049X0=biaia=aka^0K7$bc7zbLcl3yar0paZbSbUaybSb,adcpb(bYcWabci040X9}7!49c$c(cM7EcV2XbWb/cMb;8`c.aCcMb_bM8haYc21?9bc!aB9eb$bQc7c9b4cs3x9na:a{8qcF0dcHc$ckb?d5cFb2crbla.b89O9QcxbgcB3WbkbJ1?bnbp7=300+9Z0k0J1:0f0k6B1xbC9d0-0w0m0d0h0fc$9AbIc=cZc;9TcycA9ZaDc$7Bdnc6a!d484b`dC0}7Aced^cK047KcMc*bHd(cXda4scDccaMc_d:9raQec40c}c.b}99d18(c1d7aPb`c=aga,b6dt9_c`04a`d#6+8aaUef4nejco5)d3e4c#el8;c7b3e7b5dc9mcdc|8a2|0x9}eJa63xe2c$020P0x0Hd!cJ9dcSeM8YcUaDd%e#edezeKb.0Ae(e*e,d|d.f2e;afeP3GeR9Jb7cvdwc@d*bhdAf9ds6}decedTdVdXcTeMaw6Pfqeoc3eec5b%b)fv8#e{e_d80A0Af713fieufk9Mb9fdeE2kbfczfgetb5bDfndWdYf504e^bDe:fBemf%9dc:fE8P8)f,a=fDc=fGdZdx040N0VdQ4PdBfbfOd}d)12f}f 550M6a655?gc0M5_1A0x5{gh2%2Z21232#0m1.ge5_1Gf/2k2R0p0d0g0m0$a^0C0c121s1u6C0?fI1J3k1H0R0j0_0j0S0_dL7?00dNbv2T0z9:0:2R0Y0j0;0j0m9P0:bs2I0{0zgrgW1h0;0z9Z0V0jdN1:152$1j0LbT1f1/g!1j2Vh29804g)1w0z0j7=gY2o9Z0pg@2|1k3#0K9:0+bt1VdI0UgM1R1T3x1^1$1(1*635@3568gbgv1?7 6g8:8a6!fr6q046s6u706ybxdPeHb.d=e|84f)fyd8escafjeLfQ9xcLh;6;6?2ocQfr6 ftf#e6f8eS47123A0P0d0k177{h@9~h?dgb.0*bS0hb:9^b=ie84ebim88eCg4a=h*eAfMeaceiieV92is8qiod?b%0ZdRiw9ocei5i7i9dle-b{7D8M0.h{f*cNa3b~iVh+4ee%f#0YbSeqaod/i#fwi+a|e0iWi%iW9hfIdBe8ctfNdviCctffdzg0i|842-bBc|idiv6L8g1%bri!iFi3bTaxh iIe9ewib8.b^irc~97eki^bRh|d6i.d2f66)i{i2aPj7iajAd`12hxjy0m0S0S2o0KaZf=iDfujJ78f@c0e~c@ikiEe.a=j(iR7gjsexiuh(fzi0fJjFfwjH8:7hjMiW7EjOjQ0kjSf#h%j,eIbXcRjkjwf$e?f#fAjXc/d-j$ixexf.d_9~j.jpeGjgj;jii:k7c7j#ib7Sh.kn7Ej`eMj|bSk0jRksk6b.jUd5j:hLf+kdkbkfjhepj{12c-i?7Oc+kFkYkSjX6HkyipaLjok-b+jriBjtd0kbk5bDkvb.0Ek,jbk}fhj^8#jIl090jaj)jcbNcPk4k9h~kbkNe$k#5Hk*8)j?g1evill6edj7k=a0exkEkbi`fWdtiKexl5l98GcjiQkCcOkKbDlth lzfig2i f{d+cCl30}cug3f{g7bi1AhKgd2Ygt5^0.0:0=04.
Indice 1

On pourra procéder par étapes. À chaque test qui échoue, la fonction peut renvoyer False.

À la fin, si tous les critères sont validés, la fonction renvoie True.

Indice 2

Pour vérifier la présence unique des nombres de \(1\) à \(n^2\), on pourra utiliser un tableau de booléen deja_vu de longueur \(n^2+1\).

On pensera à tester au passage que les entiers sont bien de \(1\) à \(n^2\).