photocop.py

Created by schraf

Created on October 24, 2022

1.61 KB

2 exercices, un facile et un plus délicat :

Exercice 1

Lorsque l’on photocopie un document il perd toujours un peu en qualité. Voici ce que cela peut donner avec une cassette VHS .

Imaginons le cas où une lettre peut “muter” en une autre à chaque fois qu’on la photocopie. Par exemple un “A” devient un “a” puis un “#” puis un “+” etc. jusqu’à éventuellement disparaitre (“espace”)
Plus précisément, voilà ce qui pourra se passer dans notre cas :

C’est-à-dire qu’une lettre peut ne pas être modifiée (un “A” reste un “A” après photocopie) ou être dégradée (Une majuscule devient une minuscule, un “#” devient un “+” etc.)
Écrire une fonction scan(txt, n, erreur) qui à partir d’un texte écrit normalement avec des lettres dans A-Z, a-z et/ou les caractères #,+,:,. et espace ainsi que du nombre n de photocopies que l’on fait et du taux d’erreur (par exemple 0.01 pour 1% d’erreur) renvoie le texte final.
Ainsi, dans le pire des cas, en 6 photocopies le texte aura entièrement disparu.

>> scan("BONJOUR A TOUS",10,0.5)
BONJOUR A TOUS
bOnJour A toUS
bo#jour a ##Us
#o+jo#r a ++us
+o+jo+r a +:u#
+o:jo+# a ::#+
:o.#o:+ a ..#+
.o #o.+ # . #+
 o ## + +   #:
 # #+ : +   +.
 + #+ : +   + 

Exercice 2

On vous donne un texte original et un texte qui provient d’une série de photocopies. On vous demande d’écrire un programme qui permet d’affirmer que la photocopie peut provenir de l’original ou non. Par exemple, si on vous donne Bonjour A Tous comme texte original et #o:+++r a t:u# comme photocopie, il est tout à fait possible de passer de l’initial au final, par exemple en faisant :

Bonjour A Tous
bo####r A T#us
bo++##r A t+us
#o:+++r a t:u#


Par contre, si on vous donne le même texte initial mais #O:+++r a t:u# comme photoc


from random import *

def scan(txt,n,erreur):
  final = list(txt)
  for i in range(n):
    print("".join(final))
    for k,v in enumerate(final):
      if random()<erreur:
        if "A"<=v<="Z" : final[k] = v.lower()
        elif "a"<=v<="z" : final[k] = "#"
        elif v=="#" : final[k] = "+"
        elif v=="+" : final[k] = ":"
        elif v==":" : final[k] = "."
        elif v=="." : final[k] = " "
  
  return "".join(final)
  
# Version 2
  
def scan2(txt,n,erreur):
  suiv="#+:. "
  final = list(txt)
  for i in range(n):
    print("".join(final))
    for k,v in enumerate(final):
      if random()<erreur and v!=" ":
        if "A"<=v<="Z" : final[k] = v.lower()
        elif "a"<=v<="z" : final[k] = "#"
        else : final[k] = suiv[suiv.index(v)+1]
  return "".join(final)
  
# Version 3

def transfo(c,erreur):
  suiv="#+:. "
  if random()<erreur and c!=" ":
    if "A"<=c<="Z" : return c.lower()
    elif "a"<=c<="z" : return "#"
    else : return suiv[suiv.index(c)+1]
  else: return c
  
def scan3(txt,n,erreur):
  final = list(txt)
  for i in range(n):
    print("".join(final))
    final = [transfo(c,erreur) for c in final]
  return "".join(final)  
  
# Original et photocopie
# Est ce que "txt2" peut etre une photocopie de "txt1" ?

def photo(txt1,txt2):
  final = list(txt2)
  for k,v in enumerate(final):
    c = txt1[k]
    if v=="." and c==" ": return False
    if v==":" and c in ". ": return False
    if v=="+" and c in ":. ": return False
    if v=="#" and c in "+:. ": return False
    if "a"<=v<="z" and c in "#+:. ": return False
    if "A"<=v<="Z" and not("A"<=c<="Z"): return False
  return True