Bibm@th

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 24-03-2009 10:13:48

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 13 620

[Python] Utilitaire de découpe de "mes" carrés magiques sauvegardés

Bonjour,

Voici donc un utilitaire de découpe des carrés magiques sauvegardés en blocs de dimensions < 31 destinés à être chargés dans un logiciel de Traitement de Textes pour impression, découpe et recollage... Un peu de "Travail manuel", quoi...
Vous serez ainsi à même d'apprécier sur papier la structure desdits carrés !

#!/usr/bin/env python
# -*- coding: Latin-1 -*-

import glob
import os
from os import getcwd
print "    *************************************************************"
print "    ** Découpe des carrés magiques sauvegardés pour impression **"
print "    *************************************************************"
print
print
print "    Ce programme se propose de découper pour vous, avec un maximum de 124"
print "caractères par ligne, puis de composer le nombre de blocs nécessaires pour"
print "que vous puissiez les charger dans votre logiciel de Traitement de textes"
print "et imprimer un par un ces blocs crées, moyennant quelques réglages."
print
print "Cela fait, il ne vous restera qu'à jouer de la paire de ciseaux et du bâton"
print "de colle pour reconstituer le carré non affiché à l'écran..."
print
print "Les deux derniers chiffres donnent le n° de ligne de blocs et le n° de"
print "bloc sur cette ligne."

print "Réglages de base :"
print "- Marges de 1 cm et page au format Paysage,"
print "- Si nécessaire, réduire encore la taille des caractères et/ou la police"
print "  utilisée,"
print "- Pour obtenir un "+chr(34)+"vrai"+chr(34)+" carré (ou presque..), il sera"
print "  également nécessaire de "+chr(34)+"jouer"+chr(34)+"sur la taille de l'interligne."
print
print "            A vous de jouer !"

rep = getcwd()
f_txt = glob.glob(rep+chr(92)+'*.txt')
lng = len(f_txt)
noms = "ImpairsImpapairsPairspairs"
print
print          
print "  **  Voici la liste des carrés magiques sauvegardés :  **"
print
for i in range(lng):
    fichier = f_txt[i]
    if ('Impairs' or 'Papairs' or 'Impapairs') in fichier:
        print fichier
    else:
        continue
print

mode=1
while mode >0:
    nom = raw_input("   Quel fichier voulez-vous découper ?  ")
    if nom[-4:]==".txt" and nom[:7] in noms  and os.path.isfile(nom) == True:
        mode = 0
    else:
        print "Désolé votre nom de fichier n'est pas valide, veuillez recommencer."
                           
# Extraction de la dimension du carré à partir du nom du carré
nomb=nom.rstrip('.txt')                 # Suppression du .txt
rep = getcwd()                          # Nom du Dossier courant
uscore=nomb.find("_")                   # Place de _ dans ne nouveau nom
if nomb[uscore+1]=="S":
    dim = int(nomb[uscore+2:])
elif nomb[uscore+1]=="G":
    posx = nomb.find["x"]               # Position de x en cas de carré gigogne
    dim = int(nomb[uscore+2:posx])*int(nomb[posx+1:])
else:
    dim = int(nomb[uscore+1:])

# Calcul des paramètres pour lecture/découpe
l,c=0,0
lg=len(str(dim**2))+1                       # Longueur maxi des nombres + 1            
lg_tot = dim*lg                             # Longueur totale d'une ligne                      
nb_nb=124/lg                                # Nombre de nombres de longueur lg                      
nbcr_apr=nb_nb*lg                           # Nombre de caracctères à prendre          
passg=1+lg_tot/nbcr_apr                     # Nombre de passages (ou découpes)            
fichier=open(nom,'r')                       # Ouverture du fichier enregistré
Ligne=[]
for h in range(dim):                        # Parcours de toutes les lignes
    ligne=fichier.readline()                # L'une après l'autre
    Ligne.append(ligne)                     # Stockage dans une liste
fichier.close()
   
fin=passg**2  
for no in range(fin):                       # Parcours de tous les blocs un par un                      
    l,c=no/passg,no%passg                   # Nos de ligne et de colonne de blocs
    nomf=nomb+"_"+str(1+l)+str(1+c)+".txt"  # Nom du fichier à ouvrir
    f=open(nomf,"w")                        # Ouverture en écriture
    db_cl=nbcr_apr*c                        # Index de début des colonnes                      
    if c ==passg-1:                         # |
        fin_cl=lg_tot                       # |> Index de fin des colonnes
    else:                                   # |
        fin_cl=nbcr_apr*(1+c)               # |
    db_li=nb_nb*l                           # Index de début des lignes
    if l==passg-1:                          # |
        fin_li=dim                          # |> Index de fin des lignes
    else:                                   # |
        fin_li=nb_nb*(1+l)                  # |
    for j in range(db_li,fin_li):   # Examen de chaque ligne pour le bloc        
        lign=Ligne[j]               # Stockage dans chaîne de la ligne en cours
        li=lign[db_cl:fin_cl]       # Découpe des caractères voulus
        f.write(li+"\n")            # Ecriture avec changement de ligne
    f.close()
print
print "Les fichiers découpés se trouvent ici  dans "+rep+" et se nomment :"
for no in range(fin):
    print "      * "+nomb+"_"+str(1+no/passg)+str(1+no%passg)+".txt"

J'ai fait le test avec un carré Impair de dimension 41 (4 blocs), de dimension 89 (16 blocs) et de dimension 153 (64 blocs)...

Ce programme
- liste des fichiers de carrés magiques sauvegardés
- demande du nom du fichier à découper (doit être présent dans la liste)
A l'avenir, si quelqu'un essayait ces divers programmes et tombait sur un message d'erreur, je lui serais reconnaissant de m'en faire part...

Merci

Voici le résultat du programme

Quel fichier voulez-vous découper ?  Impairs_S41.txt

Les fichiers découpés se trouvent ici  dans C:\Python26 et se nomment :
      * Impairs_S41_11.txt
      * Impairs_S41_12.txt
      * Impairs_S41_21.txt
      * Impairs_S41_22.txt

Donc, il fonctionne !
J'aurais aimé programmer le choix du fichier par double clic dessus : hélas pour l'instant, c'est en dehors de mes capacités.
Toutefois, sous Windows et pas en mode console, via la souris on peut copier le nom du fichier (sans le chemin d'accès) et le coller ensuite après le point d'interrogation et valider.

Pour unifier les notations et permettre à mon programme de retrouver la dimension du carré construit quel qu'en soit le type : Impairement pairs, Impairs (simples ou gigognes) et, plus tard, Pairement pairs, sans votre intervention, j'ai rajouté dans le type 2(2k+1) l'extension .txt au fichier et modifié le code mis en ligne en conséquence...

@+

[EDIT]
Une précision : j'ai supprimé l'ancienne discussion et l'ai remplacé par celle-ci, avec le code définitif, où j'ai corrigé quelques erreurs...
Si à l'avenir, quelqu'un testant l'un de ces divers programmes se retrouvait face à une anomalie, voire à un message d'erreur, je lui serai reconnaissant de m'en faire part :)

Merci d'avance
Merci de votre compréhension


Arx Tarpeia Capitoli proxima...

Hors ligne

Réponse rapide

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
soixante sept plus cinquante cinq
Système anti-bot

Faites glisser le curseur de gauche à droite pour activer le bouton de confirmation.

Attention : Vous devez activer Javascript dans votre navigateur pour utiliser le système anti-bot.

Pied de page des forums