corrige−fichiers.py corrige−fichiers.py

Transcription

corrige−fichiers.py corrige−fichiers.py
Printed by stephane
corrige−fichiers.py
Jun 26, 13 17:59
Page 1/4
# −*− coding: utf−8 −*−
"""
Created on Thu Apr 18 15:06:14 2013
Jun 26, 13 17:59
corrige−fichiers.py
Page 2/4
#########
#
#
# EXO 6 #
#
#
#########
@author: stephane
Corrigé du TD sur les manipulations de fichiers
Stage Python à l’ÉNS Lyon, les 28 et 29 juin 2013
"""
# beaucoup auront écrit quelque chose comme :
#lp = []
#for x in filein:
#
lp.append(int(x))
#import urllib
#urllib.urlretrieve(
#
’http://blog.mp933.fr/public/Python/Annexes/materiel−tp−fichiers−ens.tar’,
#
’./materiel−tp−fichiers.tar’)
# Et c’est très bien comme ça !
# Mais le pythoneux écrira plutôt :
filein = open(’FilesIn/premierspremiers.txt’)
lp = [int(s) for s in filein]
filein.close()
#import tarfile
#tarfile.open(’materiel−tp−fichiers.tar’).extractall()
fileout = open(’FilesOut/premiers10.txt’,’w’)
################
#
#
# EXOS 1, 2, 3 #
#
#
################
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’)
Done
#########
#
#
# EXO 4 #
#
#
#########
#
#
#
#
#
fileout.close()
#########
#
#
# EXO 7 #
#
#
#########
Il y a la petite optimisation consistant à ne pas créer
la séquence des lignes (gain en espace) mais
SURTOUT
la liste n’est pas recopiée à chaque extension... le coût passe
de quadratique à linéaire.
# On va cribler des tranches de 10^5 entiers.
# D’abord, la liste des premiers plus petits que 4000 [ > sqrt(10**7)]
#########
#
#
# EXO 5 #
#
#
#########
i, p4000 = 0, []
while lp[i] < 4000:
p4000.append(lp[i])
i += 1
f = open(’FilesIn/admissibilites.txt’)
total = 0
cpt = 0
ok = 0
pasok = 0
series = [0] * 4
for l in f:
lp = l.strip().split(’\t’)
cpt += 1
if lp[2] == ’Admissible’:
ok += 1
series[int(lp[3])−1] += 1
else:
pasok += 1
f.close()
print(ok, pasok, ok+pasok, cpt, series, float(ok)/cpt)
#(1718, 3680, 5398, 5398, [417, 417, 410, 474], 0.3182660244535013)
print(map(lambda n:100.*n/ok, series))
#[24.272409778812573, 24.272409778812573, 23.864959254947614, 27.59022118742724]
Wednesday June 26, 2013
for tranche in range(100):
cribler = [True] * 10**5 # représente [10**5*tranche,10^5*(rtanche+1)]
if tranche == 0:
cribler[0:1] = [False, False]
n0 = 10**5 * tranche
for p in p4000:
k0 = p−(n0%p) # Le plus petit k>0 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
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
corrige−fichiers.py
1/2
Printed by stephane
Jun 26, 13 17:59
corrige−fichiers.py
total += nb
print ’Tranche %i : %i nombre premiers’% (tranche,nb)
fileout.close()
Page 3/4
Jun 26, 13 17:59
corrige−fichiers.py
Page 4/4
#
#
# EXO 11 #
#
#
##########
print ’Nombre total de premiers inférieurs à dix millions : ’+str(total)
# Attention ça va être gore...
#Tranche 0 : 9592 nombre premiers
#...
#Tranche 99 : 6134 nombre premiers
#Nombre total de premiers inférieurs à dix millions : 664579
#########
#
#
# EXO 8 #
#
#
#########
filein=open(’FilesIn/matrix.txt’,’r’)
# Du pur python :
m = [map(int,l.strip().split(’,’)) for l in filein]
# huhu !
filein.close()
#########
#
#
# EXO 9 #
#
#
#########
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])
# 427337
#########
#
#
# EXO 10 #
#
#
#########
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]
##########
Wednesday June 26, 2013
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
#########
#
#
# BONUS #
#
#
#########
Création des pdf.
Ça va être TRÈS gore
from reportlab.pdfgen import canvas
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])
corrige−fichiers.py
2/2

Documents pareils