Carrés semi-magiques (POO)

Carrés semi-magiques (POO)

Nous travaillons dans cet exercice sur des tableaux carrés d'entiers positifs.

Nous appelons « carré d'ordre \(n\) » un tableau de \(n\) lignes et \(n\) colonnes dont chaque case contient un entier positif.

Carré semi-magique

Un carré est dit « semi-magique » lorsque les sommes des éléments situés sur chaque ligne, chaque colonne sont égales. Cette somme est appelée constante magique ou densité du carré semi-magique.

Exemples avec trois carrés

1 7
7 1

carre_2 est semi-magique car la somme de chaque ligne et de chaque colonne est égale à 8.

3 4 5
4 4 4
5 4 3

carre_3 est semi-magique car la somme de chaque ligne et de chaque colonne est égale à 12.

2 9 4
7 0 3
6 1 8

carre_3_bis n'est pas semi-magique car la somme de la première ligne est égale à 15 alors que celle de la deuxième ligne est égale à 10.

La classe Carre ci-après contient des méthodes qui permettent de manipuler des carrés.

  • La méthode __init__ permet de créer un carré sous forme d'un tableau à deux dimensions à partir d'un p-uplet d'entiers nombres. Nous remarquons que l'ordre du carré créé est la racine carrée de la longueur du p-uplet passé en paramètre. Par exemple avec un p-uplet de taille 4, on crée un carré d'ordre 2, avec un de taille 9, un carré d'ordre 3.

  • La méthode affiche permet d'afficher le carré créé.

Exemples
>>> nombres_3 = (2, 9, 4, 7, 0, 3, 6, 1, 8)
>>> carre_3_bis = Carre(nombres_3)
>>> carre_3_bis.affiche()
[2, 9, 4]
[7, 0, 3]
[6, 1, 8]
  • La méthode somme_ligne prend en paramètre un entier i et renvoie la somme des éléments de la ligne i du carré.
Exemple
>>> carre_3_bis.somme_ligne(0)
15
  • La méthode somme_colonne prend en paramètre un entier j et renvoie la somme des éléments de la colonne j du carré.
Exemple
>>> carre_3_bis.somme_colonne(1)
10
  • La méthode est_semi_magique renvoie True si le carré est semi magique, False sinon.
Exemples
>>> carre_2.est_semi_magique()
True
>>> carre_3.est_semi_magique()
True
>>> carre_3_bis.est_semi_magique()
False

Compléter le code ci-dessous, puis le tester sur les carrés carre_2, carre_3 et carre_3_bis.

###(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
.128013:Lp(40ed3;N 1jo5_An)h]6,qc[y!CFuvi2+ms7=wlSatf-9Rrg.*TéPkb8/050i0h0T0S0I0Q0M0m0A0Q0S0M0M0O010T0I0d010406050M0G0L0L0S0Y0C040R0p0Q0G100p0t0m020S0L0d0k0m0X0h1a0Y0z0G0h0M050,17191b1d150d041B1I051L0,1L1N1I150i0I0H0^0`0|0~0v0I0Z0v0Q1#0v0T13050:0*0Q0h1W0{0}011!1$1(1$0T1.1:1,0T0*0p0i1d1-0Y1J0T0v0^1g0M0d0S0t0~0J011=1Y010U0=0h0t1o0h1,2d2f2k1@2n1:2q0L2s040a0m0(0Y0p0d0p0M0I1j1l0.2b0Y0Y0h0A2N1B2u0t1J0,292Z0T2726280i2w0~1(0t2p2K1,1T1V0_1?2-0I2/0t231U1,0d2S1J2X2Z34162e1l2^2l2}0Y1a0Q130m0n2W3814372v3a1@3c3e3g0J3j2f3l2X2,013q0S3f040m0j3u2Y153x3o0~3A3C0m0f3G3w383y3M3g0q3Q3I3S3K3z0p3d3B3g0x3X3m391X3p3$3r3D0N3+3J3.3L3:3(3D0+3@3Z3_3#3%3N0W3 3n413U040n0g463-2_423;0n3i1C3k3Y474f490n3t4k3v4m4e3b3{3C0n3F4s3H3,3T4x130n3P4B3R4n4w434G3W4J4u4E4N4a3*4Q4D3!4p3?4W3^4o4F4a3~4#404%4T0n454+4L3/4T0J4c4;4v4?3;0J4j344R4Y4(0J4r504X48534A564$4M4}4I5b4,5d3|0J4P5g4=3`4@4V5m4{5o4}4!5r4S4}4*5w524@4:5A584T0j4_5E4-3;0j4 4l575K3|0j555O5c4|5R5a5U5h5W3C0j5f5Z5n4g5R5l5)5s5+5$5q5.5x5R5v5?5B5L5z3k1K321B2?2$0i2*3y0A232C0-1U1J310h335~4J05670.6f5*0)0t130U2H0L3Q5P2l0P3g6t5V3L6o041a296y5!0~6w3D6F6m6B0I1p3$0T3Q0m6u3p130M0z0Y6Q4Q0651410)133o6K5/6I6S6h6z3z0A130E1b2S6+3y12040b3X0m706S6:6(040.0U6`3!6-78410U0L130r0r2{2M7g7b4f6|0e7l2l0*6|0M0h0Q776/6G016|0y6R6T3L132}0L0*2S1A7x5*6|0u6~4Q717R727y7r6V7u7w366:0p130!7p6U043$0i6_4J7T5*7#040O7C6:0t0*132{6Z7Z7y7n7(7E046W6Y817z137o7L5/7_132z86808a3T7F0p7H7J8f130u8p6 7S707D017V837X867;7%8h4Y131~0h0S0G7@7y7;7?7.8u6|0B8r8s7R8O138Q8C488j8l1z8n048W7~5*6B0o8J7:130K8-8b7{8;3y7;0#8@3!8w7t7v8z7$866B7+7-8)5/6|0w8{6%6p3$9a4o138,8N7!6I2{9e3b7`040Y2f0Z0h8$89963y8}8y8X4f8A9213949t9A2l7N997Q8S8T739c0Y9m7)0I9R0~0p9k0t9U3z9o9q0t9s9u869y8 9H1@9C9-829F8$0u8R7S8U049K50069N7y7476867a9:3z0U130S0U2n0A0v9G9w3!8gaf419+7Y5~6:7N7P5J6v3g8S860M0i1301ay0saa0Iac1;0G396^0%ay019^9 6m9P9Z6B1{2/9Z9W7{9Y9i7U7s9zai9B91a56B8F8H8$ap4l9MaM8b9o317|9)a(8d1#aSa57N3X9~718ua10hal3v8ua4a#3ba7838k2B0raRaeam7 889*aZ9,b91@7AaP8?a}8oa-4tb7as8sauaw04aJ6@0Q0A0G1:0m0`0m0Mbd1;0.0@0H3B0h0G0Y0@2PbKbg0m0IaJaLb17^6VbNaT138M347/5/0Lb#045Ia.at9O040U9daX8*9gaT9XaP9#9rbhb6anbka5ak90048Bbo9;0Y7,c72Y9`7Ob%bzb)bc19ck6J7!b-brcr2Bb,048:b 5/cca59/cg3z8E0S1/8G8Ibt8%9D049TcP0w8(bic0049hcI98cob:3y742S0TbUaWb/8u6BbMcsa a:c)13a2a5b8cX8bbbc=be670Q1ka|c#cacIcFd7047BcD8icZ9?bv4C6:6-ata5avaxaybEbGbIbKd1bO1z0mbR1:bUbW1;bKd3d51;0ob$9Lcp7yc;b+de3!8L9Zb=13b^4t9Mb2aOdP8YcSc2aVc4139$9(cP9vc~9xbmb5clcvcecR9=cPcndKa/c:b*c?d!a$7=cxdvcAcCc/6:dad/dQa%cIa)cL1:a+cPcWc8dMbsdbcVcRc!ec41c$d}c^3!c*0/c-e5dO9}ex9b75b4a36xa(bb1z0T0r7tb=0r1a0Z0I1xct9`d.em5*ebe!97buc%d cy0h0r6719aFctc(ede4e27qd;cdcfet9fe,bfa{eXc904eZd?7ydTb@9?e*b{b}9Qe_7)0)d%cSc.3ke?48c59%f3bjf5bl7Wbne~2lcHfx7)d`dbd|50a/b(a07{d=cuaYfvfK8ufze%dfdvf10Zd6fA0~ahfXcJ04fid{cA0Db.fme+fTe/0Le;a,c%dXb{c+eBfg0~0)6=040F3B7tf?fHaNcSfKfn4fe$f78.d^a_f0dF0tfWfRagd8f!6Bf%fDf)f+3vg83be0d2bdf;cPdi14fGdLg5f_0Yflgsb2f~g00?ctb0gD5/ezc,gG9Zf}130$0Y1y3+0,6j6e5 g%0,621B0T64g,2(2!22242$ehg)621H6l5/2S0L0r0U0S0)e-0v0j131t1veW0@gA1K3l2?3y0S0i0L1k2M0I1kb!0tb}131Hhghihk2N0V100T1 f 1k2Uhm1l6i6883181Bg$2Z1R1M040l0p0G0@8H0YhE0@0d0G0m1i0=0I7t0YbJ0S0mb}0thDhn8v0G0=0T0V2{2jhG6k1DhKhH0m2P0(0C291khdg{0c0I2pdy0hbVh*i00pbG2B0t0:2N2Fi30vhn0b6Sh+0v2S0U1Z1}0d0M0b0,g*ig0M0!0din1k0!3$0Z0,6q0,0j0,1(7I1FiMaFh/0tiE1*0L0Q031D6VhJ0,0ShM3lg*6b1S0/0;0?0m2I2p9V0d2phr16181v1d0X0%2JiXdx3B0Tic2q100H8#1Ci 1F3l1I0s1i2S0m2J0|0I0*h$0T0%i01;0Yj31k7t7KhNhf3!1_1%1)1+g|3y2y2p2r132E0R0AhV0d0Timi4gHcl6dg|355~hLdYeHfOdkeKefd0bNfUgigbe(ftcbe{cPdde9end$d{gA6$4fdl8tdnbB00k6drbHdDh+dvjubQbSdBjuiebZ0Ik6009^f-eDf,d@gr2Ygt3p9oh}d-fu8xfwgj41fQj;dfa*cOdbelkF8Dj}ep9@d}j%gFjWfLcYe66!k02lb3j)7yc}kC4oj-cse.1gdGa^d9j^dbj`kqj|esk(9Ie)4`3yk26.cIdo04klk8dtkbbNkddykfidbXh+gg2/0m0oklknf^eAgTf{9!i(6skyj@fNe|cRkH8$kKjIkMcTeplze+k_kLeu139|k@g5fecxlClL5/aUfkd)9pc6k/f!galAkDeegm9Eci95f!7NkP56g#hHg(2Zg`61i;0=0Mi-0.0:l_04.