3310 - Afin: Difference between revisions

From Bitnami MediaWiki
No edit summary
Line 38: Line 38:
== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python3" line="1">
<syntaxhighlight lang="python3" line="1">
def cifru_afin(a, b, mesaj):
def cripteaza_afin(a, b, mesaj):
     mesaj_criptat = ""
     mesaj_criptat = ""
 
     for litera in mesaj:
     for caracter in mesaj:
         if litera.isalpha():
         if caracter.isalpha():
             cod = ord(litera) - ord('a')
             if caracter.isupper():
             litera_criptata = chr((a * cod + b) % 26 + ord('a'))
                cod = (ord(caracter) - ord('A') + a) % 26
            mesaj_criptat += litera_criptata
                mesaj_criptat += chr(cod + ord('A'))
             else:
                cod = (ord(caracter) - ord('a') + a) % 26
                mesaj_criptat += chr(cod + ord('a'))
         else:
         else:
             mesaj_criptat += caracter
             mesaj_criptat += litera
 
     return mesaj_criptat
     return mesaj_criptat


def main():
# Citire date de intrare
    with open("afin.txt", "r") as fisier:
with open("afinin.txt", "r") as f:
        a, b = map(int, fisier.readline().split())
    a, b = map(int, f.readline().split())
        mesaj = fisier.readline().strip()
    mesaj = f.readline().strip()


    mesaj_criptat = cifru_afin(a, b, mesaj)
# Calculare mesaj criptat
mesaj_criptat = cripteaza_afin(a, b, mesaj)


    with open("afin.txt", "w") as fisier_out:
# Scriere rezultat în fișier de ieșire
        fisier_out.write(mesaj_criptat)
with open("afinout.txt", "w") as f_out:
    f_out.write(f"{mesaj_criptat}\n")


if __name__ == "__main__":
    main()


</syntaxhighlight>
</syntaxhighlight>

Revision as of 10:26, 27 December 2023

Enunt

Cifrul Afin este un cifru unde fiecare literă este înlocuită cu o altă literă printr-o operație matematica. Fiecărei litere i se asociază un cod: a-0, b-1, c-2, … z-25. De asemenea, mai avem două numere a și b, numite chei. Fiecare literă se înlocuiește cu litera care are codul egal cu (a*x+b)mod. 26 , unde x este codul literei.

Cerinta

Dându-se valoarea celor două chei și un mesaj să se afișeze mesajul criptat.

Date de intrare

Fișierul de intrare afinin.txt conține pe prima linie numerele a b iar pe a doua linie un mesaj.

Date de iesire

Fișierul de ieșire afinout.txt va conține pe prima linie mesajul criptat.

Restrictii si precizari

  • 1 ⩽ a , b ⩽ 26
  • 1 ⩽ lungimea șirului ⩽10000
  • mesajul va conține doar litere mici ale alfabetului englez

Exemplul 1

afinin.txt
17 20
twentyfifteen
afinout.txt
Datele introduse corespund restrictiilor impuse
fekhfmbabfkkh

Exemplul 2

afinin.txt
17 20
TWEntyfiftEEN
Datele introduse nu corespund restrictiilor impuse


Rezolvare

<syntaxhighlight lang="python3" line="1"> def cripteaza_afin(a, b, mesaj):

   mesaj_criptat = ""
   for litera in mesaj:
       if litera.isalpha():
           cod = ord(litera) - ord('a')
           litera_criptata = chr((a * cod + b) % 26 + ord('a'))
           mesaj_criptat += litera_criptata
       else:
           mesaj_criptat += litera
   return mesaj_criptat
  1. Citire date de intrare

with open("afinin.txt", "r") as f:

   a, b = map(int, f.readline().split())
   mesaj = f.readline().strip()
  1. Calculare mesaj criptat

mesaj_criptat = cripteaza_afin(a, b, mesaj)

  1. Scriere rezultat în fișier de ieșire

with open("afinout.txt", "w") as f_out:

   f_out.write(f"{mesaj_criptat}\n")


</syntaxhighlight>