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