[Python] Construction de carrés magiques impairs, simples ou gigognes. (Page 1) / Programmation / Forum de mathématiques - Bibm@th.net

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 17-03-2009 14:36:40

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 11 151

[Python] Construction de carrés magiques impairs, simples ou gigognes.

Bonjour à tous,

En complément de la page http://www.bibmath.net/carres/index.php … oi=impairs, voici la version informatisée.

Ces carrés impairs, si leur dimension n'est pas multiple de 3, sont diaboliques. Voir la page précitée ou le le programme pour une définition de l'adjectif (on dit aussi pandiagonaux).
Une autre particularité intéressante de ce programme est la possibilité de construire des carrés gigognes (à deux dimensions).
Ainsi, vous pouvez construire un carré de dimension 35 (31 maximum pour l'affichage : il sera enregistré) :
- Soit sur la base de 35 = 5 x 7, c'est à dire de 7² = 49 carrés de dimension 5,
- Soit sur la base de 35 = 5 x 7, c'est à dire de 5² = 25 carrés de dimension 7.
Chacun des 49 carrés de dimension 5, ou des 25 carrés de dimension de 7, sera magique et diabolique, le carré de 35 étant lui-même globalement magique et diabolique...
Cela dit, vous pouvez aussi construire un carré "simple" (= à une dimension) d'ordre 35 : vous avez donc 3 carrés magiques et diaboliques possibles d'ordre 35.
Le seul carré gigogne magique et diabolique affichable est celui de 25 = 5 x 5...
Bien sûr la technique utilisée pour construire les carrés gigognes à deux dimensions est extensible à 3, 4... etc  dimensions : une explication figure pour 3 dimensions sur la page internet consacrée à ces carrés...

Une assistance, par l'exemple, à la construction de carrés magiques et diaboliques simples (dimension 5 ou 7), une démo détaillée de la construction du carré magique gigogne d'ordre 35 = 3 x 5 et une assistance à la construction du carré magique gigogne d'ordre 15 = 5 x 3 par vos soins sont incluses.
Je n'ai pas prévu la vérification du caractère magique (je vais voir pour la rendre optionnelle)...

:

  1. #!/usr/bin/env python
  2. # -*- coding: Latin-1 -*-
  3.  
  4. from os import getcwd
  5.  
  6. def titre_general():
  7.     print
  8.     print
  9.     print "               *********************************************"
  10.     print "               *      CARRES DE DIMENSIONS IMPAIRES        *"
  11.     print "               *         simples et gigognes               *"
  12.     print "               *********************************************"
  13.     print    
  14.  
  15. def presentation():
  16.     print "   Ce petit programme se propose de vous faire découvrir un certain type de carrés"
  17.     print "magiques de dimension impaire."
  18.     print "Tous les carrés construits de dimension multiple de 3 ne seront pas "+ chr(34)+"diaboliques"+chr(34)
  19.     print "(ou pandiagonaux), les autres si."
  20.     print "Outre les propriétés magiques classiques, pour les carrés non multiples de 3, il faut faire"
  21.     print "intervenir la notion de "+chr(34)+" diagonale brisée"+chr(34)+"."
  22.     print
  23.     print "                      Exemple de diagonales brisées :"
  24.     print "              |---|---|---|---|---|          |---|---|---|---|---|"
  25.     print "              |   |   |   | X |   |          | O |   |   |   |   |"
  26.     print "              |---|---|---|---|---|          |---|---|---|---|---|"
  27.     print "              |   |   |   |   | X |          |   |   |   |   | O |"
  28.     print "              |---|---|---|---|---|          |---|---|---|---|---|"
  29.     print "              | X |   |   |   |   |          |   |   |   | O |   |"
  30.     print "              |---|---|---|---|---|          |---|---|---|---|---|"
  31.     print "              |   | X |   |   |   |          |   |   | O |   |   |"
  32.     print "              |---|---|---|---|---|          |---|---|---|---|---|"
  33.     print "              |   |   | X |   |   |          |   | O |   |   |   |"
  34.     print "              |---|---|---|---|---|          |---|---|---|---|---|"
  35.     print
  36.     presse()
  37.     print
  38.     print "La somme des nombres figurés par un X, ou O est aussi égale à la constante magique, soit n(n²+1)/2,"
  39.     print "65 pour un carré d'ordre 5."
  40.     print "Partons du X sis en ligne 1, colonne 4, descendons d'une case vers la droite. Ensuite, comme"
  41.     print "on ne peut sortir du carré, on descend sur la case en dessous et on ricoche vers la gauche "
  42.     print "comme au billard !) et on reprend la descente. Le procédé est identique pour le O"
  43.     print
  44.     print "    Le carré cigogne (éventuellement diabolique) lui, est composé de carrés plus petits eux-mêmes"
  45.     print "magiques (et éventuellement diaboliques). Ainsi le carré de 15 = 3 x 5 sera composé de 25 carrés"
  46.     print "d'ordre 3, mais le carré de 15 = 5 x 3 sera lui composé de 9 carrés d'ordre 5."
  47.     print "Il suffit de réfléchir quelques secondes pour voir que les deux carrés obtenus seront différents..."
  48.     print " La multiplicationn magique n'est donc PAS COMMUTATIVE !"
  49.     print
  50.     return
  51.  
  52. def presse():
  53.     print
  54.     raw_input("                  ... Pour la suite, presser la touche ENTREE ...")
  55.     print
  56.  
  57. def retour():
  58.     print
  59.     raw_input("                    ... Pour revenir au menu, presser ENTREE ...")
  60.     print
  61.    
  62. def voici():
  63.     print
  64.     print "                      Voici le carré demandé :"
  65.     print
  66.    
  67. def choix_type(gig):
  68.     sortie=0
  69.     while not sortie:
  70.         try:
  71.             gig = int(raw_input("Construction d'un carré simple ou gigogne (1/2) ? "))
  72.             print
  73.             if gig <1 or gig >2:
  74.                 print "Désolé ! Vous devez répondre avec 1 ou 2. Veuillez recommencer..."
  75.                 print
  76.             else:
  77.                 sortie=1                  
  78.         except ValueError:
  79.             print "Désolé ! Ce n'est pas un nombre. Essayez encore..."
  80.     return gig
  81.  
  82. def choix_dimension(dim):
  83.     sortie=0
  84.     while not sortie:
  85.         try:
  86.             dim = int(raw_input("Veuillez choisir une dimension impaire : "))
  87.             if dim % 2 != 1:
  88.                 print "Désolé ! Vous n'avez pas entré une dimension valide. Veuillez recommencer..."
  89.                 print
  90.             else:
  91.                 sortie=1
  92.         except ValueError:
  93.             print "Désolé ! Ce n'est pas un nombre. Essayez encore..."
  94.     return dim
  95.  
  96. def calcul(dim,car_mag):
  97.     L=[]
  98.     dc,dl=(dim+1-2*(dim%3==0))/2,0
  99.     lc,cc=dl,dc
  100.     for j in range(dim):
  101.         for i in range(dim):
  102.             lc=lc-(i>0)
  103.             lc+=dim*(lc==-1)
  104.             cc=cc-(i>0)
  105.             cc+=dim*(cc==-1)
  106.             L.append(dim*lc+cc+1)
  107.         car_mag.append(L)
  108.         L=[]
  109.         dl+=2
  110.         dl-=dim*(dl>dim)
  111.         lc=dl
  112.         if dim%3==0:
  113.             dc+=1
  114.             dc-=dim*(dc==dim)
  115.             cc=dc
  116.         else:
  117.             dc+=3
  118.             dc-=dim*(dc>dim-1)
  119.             cc=dc
  120.     return dim,car_mag
  121.  
  122. def gigognes(n1,n2,car_nat,car_fin):
  123.     dim,fin,car_mag,car_nat,car_fin=n1,n2**2,[],[],[]
  124.     L1,L2,n=[],[],n1*n2
  125.     dim,car_mag=calcul(dim,car_mag)
  126.     for j in range(n):
  127.         for i in range(n):
  128.             L1.append(0)
  129.             L2.append(0)
  130.         car_nat.append(L1)
  131.         car_fin.append(L2)
  132.         L1,L2=[],[]
  133.        
  134.     for no_qd in range(fin):            
  135.         # correctif pour passage dans le carré d'ordre n
  136.         cl=no_qd/n2
  137.         cc=no_qd%n2
  138.         crl,crc=cl*n1,cc*n1
  139.         for l in range(n1):
  140.             for c in range(n1):
  141.                 # coordonnées de la case en cours
  142.                 j,i=l+crl,c+crc
  143.                 #print j,i," ",
  144.                 # nombre du carré n1 à mettre dans cette case
  145.                 dpl=car_mag[l][c]
  146.                 # coordonnées relatives dans carré n1 de ce nombre
  147.                 ll=(dpl-1)/n1
  148.                 cc=(dpl-1)%n1
  149.  
  150.                 # coordonnées absolues dans carré n de ce nombre
  151.                 jj,ii=ll+crl,cc+crc
  152.                 car_nat[j][i]=n*jj+ii+1
  153.              
  154.     dim,car_mag=n2,[]
  155.     dim,car_mag=calcul(dim,car_mag)
  156.     # Boucle des nos de carrés (d'ordre n1) de 0 à n2^2
  157.     for no_qd in range(fin):
  158.         # Cordonnées des carrés d'ordre n1 (variant de 0 à n2)
  159.         l_img=no_qd/n2
  160.         c_img=no_qd%n2
  161.         # correctif pour passage dans le carré d'ordre n
  162.         cj,ci=l_img*n1,c_img*n1
  163.         # numéro du carré aà déplacer
  164.         ant=car_mag[l_img][c_img]
  165.         # coordonnées absolues du 1er nombre du carré antécédent
  166.         # variant de 0 à n2
  167.         l_ant=(ant - 1)/n2
  168.         c_ant=(ant -1)%n2
  169.         # correctif pour passage dans le carré d'ordre n
  170.         cl,cc=l_ant*n1,c_ant*n1
  171.         # Déplacement des nombres du carré antécédent
  172.         for l in range(n1):
  173.             for c in range(n1):
  174.                 car_fin[cj+l][ci+c]=car_nat[cl+l][cc+c]
  175.     return n1,n2,car_nat,car_fin
  176.  
  177. def demo3x5():
  178.     n1,n2,n,ct,car_nat,car_fin,car_mag=3,5,15,1,[],[],[]
  179.     print
  180.     print
  181.     print "                  ******************************************************"
  182.     print "                  *      CONTRUCTION du CARRE d'ordre 15 = 3 x 5       *"
  183.     print "                  ******************************************************"
  184.     print    
  185.     print "1. On commence par construire le carré naturel d'ordre 15 qu'on remplit avec"
  186.     print "   les nombres de 1 à 225, puis on matérialise les 25 carrés de 3 x 3 :"
  187.     print
  188.     n1,n2,car_nat,car_fin=gigognes(n1,n2,car_nat,car_fin)
  189.     cpc,cpl,sep=0,0,3
  190.     affichage_separations(ct,sep,car_mag)
  191.     dim,car_mag=3,[]
  192.     presse()
  193.     print "                                      2 7 6"
  194.     print "2. A l'aide du carré de 3 que voici : 9 5 1"
  195.     print "                                      4 3 8"
  196.     print
  197.     print"3. Dans chaque carré de 3 x 3, on déplace chaque nombre selon la structure ci-dessus :"
  198.     print
  199.     presse()
  200.     car_mag=list(car_nat)
  201.     ct=2
  202.     affichage_separations(ct,dim,car_mag)
  203.     presse()
  204.     print "                                                                   ----------------"
  205.     print "                                                                  |  4 23 17 11 10 |"
  206.     print "4. On numérote de 1 à 25 les carrés de 3 dans l'ordre normal.     | 12  6  5 24 18 |"
  207.     print "5. On déplace chaque carré à la place de son numéro dans le       | 25 19 13  7  1 |"
  208.     print "   carré de 5 ci contre :                                         |  8  2 21 20 14 |"
  209.     print "                                                                  | 16 15  9  3 22 |"  
  210.     print "                                                                   ----------------"
  211.     voici()
  212.     car_mag=list(car_fin)
  213.     print
  214.     affichage_separations(ct,dim,car_mag)
  215.     return
  216.  
  217. def solo5x3():
  218.     n1,n2,n,ct,car_nat,car_fin,car_mag=5,3,15,1,[],[],[]
  219.     print
  220.     print
  221.     print "                  ******************************************************"
  222.     print "                  *      CONTRUCTION du CARRE d'ordre 15 = 5 x 3       *"
  223.     print "                  ******************************************************"
  224.     print
  225.     print "1. Munissez-vous de quoi écrire..."
  226.     print "2. Commencez par tracer trois grilles carrées de 15 x 15. Remplissez la"
  227.     print "   première avec les nombres de 1 à 225, puis matérialisez les 9 carrés"
  228.     print "   de 5 x 5 :"
  229.     n1,n2,car_nat,car_fin=gigognes(n1,n2,car_nat,car_fin)
  230.     cpc,cpl,sep,ct=0,0,5,1
  231.     presse()
  232.     affichage_separations(ct,sep,car_mag)
  233.     print
  234.     print "3. Construisez les carrés magiques d'ordre 5 et 3,"
  235.     presse()
  236.     print "                      -------------------- "
  237.     print "                     |  4  23  17  11  10 |             -------"
  238.     print "                     | 12   6   5  24  18 |            | 2 7 6 |"
  239.     print "                     | 25  19  13   7   1 |            | 9 5 1 |"
  240.     print "                     |  8   2  21  20  14 |            | 4 3 8 |"
  241.     print "                     | 16  15   9   3  22 |             -------"  
  242.     print "                      -------------------- "
  243.     print " 4. Complétez chaque carré de base de la deuxième grille, avec les nombres"
  244.     print "    du carré correspondant de la première grille, placés dans l'ordre de la"
  245.     print "    strucure du carré d'ordre de 5 ci-dessus,"
  246.     presse()
  247.     car_mag=list(car_nat)
  248.     ct=2
  249.     affichage_separations(ct,sep,car_mag)
  250.     print
  251.     print "5. Numérotez les blocs de la deuxième grille de 1 à 9, puis complétez la"
  252.     print "   dernière grille en plaçant chaque carré numéroté à la place qu'il occupe"
  253.     print "   dans le carré de 3."
  254.     presse()
  255.     car_mag=list(car_fin)
  256.     voici()
  257.     affichage_separations(ct,sep,car_mag)
  258.     return
  259.    
  260. def affichage_separations(ct,sep,car_mag):
  261.     cpl,cpc=0,0
  262.     tirets="----"
  263.     ligne="         |------------------------------------------------\
  264. -----------------"+tirets[0:4*(sep==3)]+"|"
  265.     print ligne
  266.     for j in range (15):
  267.         print "         |",
  268.         cpl+=1
  269.         for i in range(15):
  270.             cpc+=1
  271.             if ct==1:
  272.                 nb=str(15*j+i+1)
  273.             else:
  274.                 nb=str(car_mag[j][i])
  275.             lg=len(nb)
  276.             if lg==1:
  277.                 print"  "+nb,
  278.             elif lg==2:
  279.                 print" "+nb,
  280.             else:
  281.                 print nb,
  282.             if cpc%sep==0 and i>0:
  283.                 print"|",
  284.         print
  285.         if cpl%sep==0 and j>0:
  286.              print ligne
  287.     return
  288.  
  289. def affichage(dim,n1,n2,car_mag):
  290.     if dim<32:
  291.         print
  292.         for j in range(dim):
  293.             for i in range(dim):
  294.                 if dim<10:
  295.                     print "%2i" % car_mag[j][i],
  296.                 else:
  297.                     print "%3i" % car_mag[j][i],
  298.             print
  299.     else:
  300.         print "... Dimension trop grande pour l'affichage : écriture dans un fichier ..."
  301.         presse()
  302.         stockage(dim,n1,n2,car_mag)
  303.     return
  304.  
  305. def stockage(dim,n1,n2,car_mag):
  306.     rep = getcwd()
  307.     if n2>1:
  308.         nom = "Impairs_G" + str(n1)+"x"+str(n2)+".txt"
  309.     else:
  310.         nom = "Impairs_S" + str(dim)+".txt"
  311.     chemin_nom=rep+chr(92)+nom
  312.     fichier = open(nom,'w')
  313.     lgmax = 1 + len(str(dim**2))
  314.     blanc = "             "
  315.     for j in range(dim):
  316.         enreg=""
  317.         for i in range(dim):
  318.             nb = str(car_mag[j][i])
  319.             lg = len(nb)
  320.             enreg += blanc[0:lgmax-lg]+nb            
  321.         fichier.write(enreg+"\n")
  322.     fichier.close()
  323.     print "Vous trouverez votre fichier ici",chemin_nom
  324.     return
  325.  
  326. def gere_carres():
  327.     gig,dim,n1,n2,Dim,car_nat,car_fin,car_mag=1,1,1,1,[],[],[],[]
  328.     titre_general()  
  329.     gig=choix_type(gig)
  330.     for i in range(gig):
  331.         dim=choix_dimension(dim)
  332.         Dim.append(dim)
  333.     if gig>1:
  334.         n1,n2=Dim[0],Dim[1]
  335.         n1,n2,car_nat,car_fin=gigognes(n1,n2,car_nat,car_fin)
  336.         voici()
  337.         dim=n1*n2
  338.         car_mag=list(car_fin)
  339.         if dim<32:
  340.             voici()
  341.         affichage(dim,n1,n2,car_mag)
  342.     else:
  343.         dim,car_mag=calcul(dim,car_mag)
  344.         n1=dim
  345.         if dim < 32:
  346.             voici()
  347.         affichage(dim,n1,n2,car_mag)
  348.     return
  349.  
  350. def menu(mode):
  351.     while mode >5 or mode <0:
  352.         try:
  353.             print
  354.             print "                          ***********************"
  355.             print "                          *   Menu principal    *"
  356.             print "                          ***********************"
  357.             print
  358.             print "1. Voir un carré simple ou gigogne"
  359.             print "2. Voir la méthode de construction d'un carré simple (n = 5 ou 7)"
  360.             print "3. Construire vous-même le carré simple de dimension n = 11 et le vérifier"
  361.             print "4. Voir la méthode construction du carré gigogne de 3 x 5"
  362.             print "5. Construire vous-même le carré gigogne de 5 x 3"
  363.             print "          0. Sortie du programme."
  364.             print
  365.             mode = int(raw_input("                            < Votre choix ? >  "))
  366.             print
  367.             if mode > 5 or mode <0 :
  368.                 print
  369.                 print "Désolé ! Votre choix n'est pas valide. Veuillez recommencer..."
  370.                 print
  371.         except ValueError:
  372.             print "Désolé ! Ce n'est pas un nombre. Essayez encore..."
  373.             print
  374.     return mode
  375.  
  376. def methode_car_simple(dim,car_mag):
  377.     print
  378.     print "              ********************************************************"
  379.     print "              *  Méthode de constructions de carrés impairs simples  *"
  380.     print "              ********************************************************"
  381.     print
  382.     print "Chacun des nombres de ce carré est répéré par un couple de coordonnées (ligne,colonne)"
  383.     print "Voici pour chacun des nombres du carré magique, le n° de ligne puis le n° de colonne"
  384.     print "donnant sa position dans le carré naturel ci-dessus :"
  385.     print "                  N° de ligne                     N° de colonne"
  386.     dim,car_mag=calcul(dim,car_mag)
  387.     affiche_coordonnees(dim,car_mag)
  388.     affiche_methode_coordonnees(dim)
  389.     if dim==5:
  390.         print "(3 ; 3) et donc le nombre 13."
  391.     else:
  392.         print "(6, 7) et donc le nombre 42."
  393.     presse()
  394.     print "Voici le carré "+chr(34)+"naturel"+chr(34)+" de dimension",dim,"et le carré magique correspondant"
  395.     print
  396.     for l in range(dim):
  397.         print "                  ",
  398.         for k in range(dim):
  399.             nb=dim*l+k+1
  400.             print "%2i" % nb,
  401.         print "                  ",
  402.         for k in range(dim):
  403.             print "%2i" % car_mag[l][k],
  404.         print
  405.     return
  406.  
  407. def calcul_solo():
  408.     print "                               ** RAPPEL **"
  409.     print
  410.     affiche_methode_coordonnees(11)
  411.     print "(1 ; 4) dans le carré naturel et donc le nombre 4"
  412.     print
  413.     print "Construisez vos deux matrices de nos de lignes et de nos de colonne...",
  414.     dim,car_mag=11,[]
  415.     dim,car_mag=calcul(dim,car_mag)
  416.     print
  417.     raw_input("                     C'est fait ? Alors appuyez sur ENTREE")
  418.     print
  419.     print "                     N° de ligne                             N° de colonne"
  420.     affiche_coordonnees(dim,car_mag)
  421.     print "                 C'était juste ? Non ? Relisez encore les explications..."
  422.     presse()
  423.     voici()
  424.     affichage(dim,n1,n2,car_mag)
  425.     return
  426.                
  427. def affiche_methode_coordonnees(dim):
  428.     print
  429.     print "          Pour trouver les n°s de ligne :"
  430.     print "Partir de 1."
  431.     print "- Horizontalement, chaque n° de ligne se déduit du précédent en lui soustrayant 1."
  432.     print "  Mais vous devrez ajouter n, dès le 0 atteint, puis reprendre les additions."
  433.     print "- Verticalement, chaque n° se déduit du précédent en lui ajoutant 2."
  434.     print "  Mais vous devrez soustraire n, dès que le n° de ligne dépassera cette valeur."
  435.     print "  puis reprendre les additions."
  436.     print
  437.     print "          Pour trouver les n°s de colonne :"
  438.     print "Partir de (n+3)/2 si la dimension n n'est pas multiple de 3, de (n+1)/2 sinon."
  439.     print "Ici : ("+str(dim)+"+3)/2 =",(dim+3)/2,"."
  440.     print "- Horizontalement, chaque n° de colonne se déduit du précédent en lui ôtant 1."
  441.     print "  Mais vous devrez ajouter n, dès que le n° de colonne dès le 0 atteint"
  442.     print "  puis reprendre les additions."
  443.     print "- Verticalement, chaque n° se déduit du précédent en lui ajoutant 3."
  444.     print "  Mais vous devrez soustraire n dès que le n° de ligne dépassera cette valeur,"
  445.     print "  puis reprendre les additions."
  446.     print
  447.     print "Ainsi, dans la case de coordonnées ("+str(dim-2)+" ; " +str((dim+1)/2)+") se trouvera le nombre de"
  448.     print "coordonnées",
  449.     return        
  450.    
  451. def affiche_coordonnees(dim,car_mag):
  452.     print
  453.     for j in range(dim):
  454.         print "           ",
  455.         for i in range(dim):
  456.             nc=car_mag[j][i]
  457.             l=1+(nc-1)/dim
  458.             if dim>9:
  459.                 print "%2i" % l,
  460.             else:
  461.                 print l,
  462.         print "           ",        
  463.         for i in range(dim):
  464.             nc=car_mag[j][i]
  465.             c=1+(nc-1)%dim
  466.             if dim>9:
  467.                 print "%2i" % c,
  468.             else:
  469.                 print c,
  470.         print
  471.     print
  472.     return
  473.      
  474. # Gestion des choix
  475. mode,pres=10,0
  476. while mode!=0:
  477.     pres+=1
  478.     titre_general()
  479.     if pres==1:
  480.         presentation()
  481.     car_mag=[]
  482.     mode=menu(mode)
  483.     if mode==1:
  484.         gere_carres()
  485.         mode=10
  486.     elif mode==2:
  487.         dim=choix_dimension(5)
  488.         car_mag=[]
  489.         dim,car_mag=calcul(dim,car_mag)
  490.         methode_car_simple(dim,car_mag)
  491.         mode=10
  492.     elif mode==3:
  493.         titre_general()
  494.         calcul_solo()
  495.         mode=10
  496.     elif mode==4:
  497.         demo3x5()
  498.         mode=10
  499.     elif mode==5:
  500.         solo5x3()
  501.         mode=10
  502.     if mode > 0:
  503.         retour()    
  504. print
  505. print "                       Au revoir !"

Si vous décidiez d'exécuter ce grogramme dans une fenêtre DOS remplacer la 2e ligne :
# -*- coding: Latin-1 -*-
par celle-ci :
# -*- coding: cp437 -*-
afin de profiter des caractères accentués.

Réactions, Commentaires bienvenus...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#2 18-03-2009 08:09:06

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 11 151

Re : [Python] Construction de carrés magiques impairs, simples ou gigognes.

Bonjour à tous,

J'ai modifié la méthode de stockage et le nommage du fichier : il a donc quelques modifs un peu partout...
Désolé.
J'ai encore aussi purgé le code de différentes "déclarations" inutiles, mais ça ce sont des broutilles...

Enjoy !

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#3 21-03-2009 18:58:30

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 11 151

Re : [Python] Construction de carrés magiques impairs, simples ou gigognes.

Bonsoir,

Encore une retouche mineure, pour rendre les messages affichés, en cas d'appel au module de stockage, plus aérés...
Voici le code retouché :

:

  1. def affichage(dim,n1,n2,car_mag):
  2.     if dim<33:
  3.         print
  4.         for j in range(dim):
  5.             for i in range(dim):
  6.                 if dim<10:
  7.                     print "%2i" % car_mag[j][i],
  8.                 else:
  9.                     print "%3i" % car_mag[j][i],
  10.             print
  11.     else:
  12.         print
  13.         print "        ... Dimension trop grande pour l'affichage : écriture dans un fichier ..."
  14.         stockage(dim,n1,n2,car_mag)
  15.     return
  16.  
  17. def stockage(dim,n1,n2,car_mag):
  18.     rep = getcwd()
  19.     if n2>1:
  20.         nom = "Impairs_G" + str(n1)+"x"+str(n2)+".txt"
  21.     else:
  22.         nom = "Impairs_S" + str(dim)+".txt"
  23.     chemin_nom=rep+chr(92)+nom
  24.     fichier = open(nom,'w')
  25.     lgmax = 1 + len(str(dim**2))
  26.     blanc = "             "
  27.     for j in range(dim):
  28.         enreg=""
  29.         for i in range(dim):
  30.             nb = str(car_mag[j][i])
  31.             lg = len(nb)
  32.             enreg += blanc[0:lgmax-lg]+nb            
  33.         fichier.write(enreg+"\n")
  34.     fichier.close()
  35.     print
  36.     print "      Vous trouverez votre fichier ici",chemin_nom
  37.     return

Et je mets en ligne un utilitaire de découpe des carrés en vue de l'impression si dimension > 31...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

Réponse rapide

Veuillez composer votre message et l'envoyer

Les questions suivantes sont faites pour éviter le spam. Si vous voulez ne plus les avoir, inscrivez-vous!

Quel est le résultat de 43+38?

Quel est le 5 ième chiffre de 8905970?

Pied de page des forums

[ Générées en 0.083 secondes, 9 requêtes exécutées - Utilisation de la mémoire : 2.56 MiB (pic d'utilisation : 2.82 MiB) ]