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