Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#1 24-03-2009 11:13:48
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 946
[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 !
# -*- 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