corrige−fichiers.py corrige−fichiers.py
Transcription
corrige−fichiers.py corrige−fichiers.py
Printed by stephane Apr 29, 13 8:35 corrige−fichiers.py Page 1/6 # −*− coding: utf−8 −*− """ Created on Thu Apr 18 15:06:14 2013 @author: stephane """ import urllib urllib.urlretrieve(’http://blog.mp933.fr/public/Python/\ Annexes/materiel−tp−fichier.tar’,’./materiel−tp−fichier.tar’) ######### # # # EXO 1 # # # ######### filein = open(’FilesIn/premierspremiers.txt’) # beaucoup auront écrit quelque chose comme : #lp = [] #for x in filein.readlines(): # lp.append(int(x)) # Et c’est très bien comme ça ! # Mais le pythoneux écrira plutôt : lp = [int(s) for s in filein.readlines()] filein.close() fileout = open(’FilesOut/premiers10.txt’,’w’) for i in range(100): for j in range(10): fileout.write(str(lp[10*i+j])) if j < 9: fileout.write(’\t’) fileout.write(’\n’) Apr 29, 13 8:35 corrige−fichiers.py Page 2/6 k0 += p fileout = open(’FilesOut/premiers/Tranche’+str(tranche)+’.txt’,’w’) nb = 0 for i in range(10**5): if cribler[i]: fileout.write(str(10**5*tranche+i)) if nb%10 == 9: fileout.write(’\n’) else: fileout.write(’,’) nb += 1 total += nb print ’Tranche %i : %i nombre premiers’% (tranche,nb) fileout.close() print ’Nombre total de premiers inférieurs à un million : ’+str(total) #Tranche 0 : 9592 nombre premiers #Tranche 1 : 8392 nombre premiers #Tranche 2 : 8013 nombre premiers #Tranche 3 : 7863 nombre premiers #Tranche 4 : 7678 nombre premiers #Tranche 5 : 7560 nombre premiers #Tranche 6 : 7445 nombre premiers #Tranche 7 : 7408 nombre premiers #Tranche 8 : 7323 nombre premiers #Tranche 9 : 7224 nombre premiers #Nombre total de premiers inférieurs à un million : 78498 ######### # # # EXO 3 # # # ######### filein=open(’FilesIn/matrix.txt’,’r’) # Du pur python : m = [map(int,l.strip().split(’,’)) for l in filein.readlines()] fileout.close() filein.close() ######### # # # EXO 2 # # # ######### # Tout d’abord, la liste des premiers plus petits que 1000 i, p1000 = 0, [] while lp[i] < 1000: p1000.append(lp[i]) i += 1 total = 0 for tranche in range(10): cribler = [True] * 10**5 if tranche == 0: cribler[0:1] = [False,False] n0 = 10**5*tranche for p in p1000: k0 = p−(n0%p) # Le plus petit k tel que p divise n0+k (si si...) if k0 == p: k0=0 while k0 < 10**5: if tranche <> 0 or k0 > p: cribler[k0] = False Monday April 29, 2013 ######### # # # EXO 4 # # # ######### phi = [[0]*80 for _ in range(80)] #phi = [[0]*80]*80 serait il est vrai plus tellement élégant... phi[0][0]=m[0][0] for i in range(1,80): phi[i][0] = phi[i−1][0]+m[i][0] phi[0][i] = phi[0][i−1]+m[0][i] for i in range(1,80): for j in range(1,80): phi[i][j] = min(phi[i−1][j],phi[i][j−1])+m[i][j] print(phi[−1][−1]) ######### # # # EXO 5 # # # ######### corrige−fichiers.py 1/3 Printed by stephane Apr 29, 13 8:35 corrige−fichiers.py sudo = open(’FilesIn/sudoku.txt’,’r’) grids = [] for i in range(50): sudo.readline() # Pour virer la ligne de description grid = [] for _ in range(9): l = sudo.readline().strip() grid.append(map(int,list(l))) grids.append(grid) sudo.close() #>>> grids[0][0] #[0, 0, 3, 0, 2, 0, 6, 0, 0] ######### # # # EXO 6 # # # ######### def prettyprinting(gr): """ retourne une chaine prettyprintant la grille ! """ i = 0 toprint = ’ ’+(’−’*17)+’\n’ for l in gr: s = "|" for j in range(8): if l[j] <> 0: s += str(l[j]) else: s += ’ ’ if j == 2 or j == 5: s += ’|’ else: s += ’ ’ if l[8] <> 0: s += str(l[8])+’|’ else: s += ’ |’ toprint += s+’\n’ i += 1 if (i%10)%3 == 0: toprint += ’ ’+(’−’*17)+’\n’ return toprint #>>> print(prettyprinting(grids[10])) # −−−−−−−−−−−−−−−−− #| |1 2 5|4 | #| 8|4 | | #|4 2 |8 | | # −−−−−−−−−−−−−−−−− #| 3 | | 9 5| #| 6 |9 2| 1 | #|5 1 | | 6 | # −−−−−−−−−−−−−−−−− #| | 3| 4 9| #| | 7|2 | #| 1|2 9 8| | # −−−−−−−−−−−−−−−−− ######### # # # EXO 7 # # # ######### from reportlab.pdfgen import canvas Monday April 29, 2013 Page 3/6 Apr 29, 13 8:35 corrige−fichiers.py Page 4/6 from reportlab.lib.units import cm (x0,deltax)=(5,1) (y0,deltay)=(15,1) def unpdf(numero,grid): nom = "FilesOut/sudoku/grille"+str(numero+1)+".pdf" pdfsudo = canvas.Canvas(nom) pdfsudo.drawString((x0+3*deltax)*cm, 25*cm, ’Grille numéro ’+str(numero+1)) for i in range(10): pdfsudo.line(x0*cm,(y0+i*deltay)*cm,(x0+9*deltax)*cm,(y0+i*deltay)*cm) pdfsudo.line((x0+i*deltax)*cm,(y0+9*deltay)*cm,(x0+i*deltax)*cm,y0*cm) if i == 3 or i == 6: pdfsudo.line((x0+i*deltax)*cm−1,(y0+9*deltay)*cm,\ (x0+i*deltax)*cm−1,y0*cm) pdfsudo.line((x0+i*deltax)*cm+1,(y0+9*deltay)*cm,\ (x0+i*deltax)*cm+1,y0*cm) pdfsudo.line(x0*cm,(y0+i*deltay)*cm+1,\ (x0+9*deltax)*cm,(y0+i*deltay)*cm+1) pdfsudo.line(x0*cm,(y0+i*deltay)*cm−1,\ (x0+9*deltax)*cm,(y0+i*deltay)*cm−1) for i in range(9): for j in range(9): if grid[j][i] <> 0: pdfsudo.drawString((x0+(i+0.3)*deltax)*cm,\ (y0+(8.3−j)*deltay)*cm,str(grid[j][i])) pdfsudo.save() for i in range(len(grids)): unpdf(i,grids[i]) ######### # # # EXO 8 # # # ######### import Image MonaBlack = Image.open(’FilesIn/joconde.bmp’).convert(’L’) Histo = [0]*256 for d in MonaBlack.getdata(): Histo[d] += 1 # Aussi simple que ça ? Ben oui ! Cumule = [Histo[0]] for n in Histo[1:]: Cumule.append(Cumule[−1]+n) # Hack diabolique : l[−1] est le dernier élément de la liste... #>>> MonaBlack.histogram() == Histo #True #>>> Mona = Image.open(’FilesIn/joconde.bmp’) #>>> hm=Mona.histogram() #>>> len(hm) #768 # Visiblement, les histogrammes des trois couleurs sont concaténés... resultats = open(’FilesOut/Mona.csv’,’w’) for i in range(256): resultats.write("{0};{1};{2}\n".format(i,Histo[i],Cumule[i])) resultats.close() # C’est la façon «moderne» de formater des strings. Pas trop ma tasse de thé... ######### # # # EXO 9 # # # corrige−fichiers.py 2/3 Printed by stephane Apr 29, 13 8:35 corrige−fichiers.py Page 5/6 Apr 29, 13 8:35 corrige−fichiers.py Page 6/6 ######### for i in range(110,135): for j in range(120,200): bar[i,j] = [0,0,255] import matplotlib.pyplot as plt (h,l) = MonaBlack.size maxi = max(Histo) Image.fromarray(bar,mode=’RGB’).save(’FilesOut/MonaConsternee.jpg’) plt.plot(range(256),map(lambda x:float(x)/maxi,Histo)) plt.plot(range(256),map(lambda x:float(x)/(h*l),Cumule)) ########## # # # EXO 13 # # # ########## plt.axis([0,255,0,1]) plt.xlabel(’Niveaux de gris’) plt.xticks([k*32 for k in range(9)]) # Ce sont des fioritures... plt.ylabel(u"Distribution; somme normalisée") plt.title(’Distribution des pixels pour la Joconde’) plt.savefig(’FilesOut/HistoMona.pdf’) bar=numpy.array(Mona) plt.show() z1 = bar[x0:x0+dx,y0:y0+dy].copy() # Sans la copie, on a une mauvaise surprise... bar[x0:x0+dx,y0:y0+dy] = bar[x1:x1+dx,y1:y1+dy] bar[x1:x1+dx,y1:y1+dy] = z1 Image.fromarray(bar,mode=’RGB’).save(’FilesOut/MonaCut.jpg’) x0,y0,x1,y1,dx,dy = 90,120,400,80,100,100 ########## # # # EXO 10 # # # ########## MonaBlack.save(’FilesOut/jocondeBW.jpg’) #>>> print MonaBlack.histogram() == Image.open(’FilesOut/jocondeBW.jpg’).histogr am() #False ########## # # # EXO 11 # # # ########## import numpy def floutage(image,v): """v est le nombre de points pris de chaque coté""" tableau=numpy.array(image) (h,l,_)=tableau.shape # La troisième composante vaut 3 : on est en RGB floue = tableau.copy() for i in range(v,h−1−v): for j in range(v,l−v−1): for k in range(3): voisinage = tableau[i−v:i+v+1,j−v:j+v+1,k] floue[i][j][k] = numpy.sum(voisinage) / ((2*v+1)**2) return(Image.fromarray(floue,mode=’RGB’)) Mona = Image.open(’FilesIn/joconde.bmp’) #floutage(Mona,3).show() # # # # Ça prend des plombes (15 secondes). Un peu trop à mon avis 350*540*3*(2*3+1)^2 vaut dans les 25 millions... Bon, OK Quoique non : en remplaçant 3 par 1 ou 5, le temps ne change guère. Exercice : expliquer ! ########## # # # EXO 12 # # # ########## bar=numpy.array(Mona) Monday April 29, 2013 corrige−fichiers.py 3/3