3310 - Afin: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == 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 ==...
 
 
(3 intermediate revisions by the same user not shown)
Line 1: Line 1:
== Enunt ==
== 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.
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 ==
== Cerinta ==
Line 8: Line 8:
== Date de intrare ==
== Date de intrare ==


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


== Date de iesire ==
== Date de iesire ==


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


== Restrictii si precizari ==
== Restrictii si precizari ==


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


== Exemplul 1 ==
== Exemplul 1 ==
;Intrare
;afinin.txt
:17 20
:17 20
:twentyfifteen
:twentyfifteen
;Iesire
;afinout.txt
;Datele introduse corespund restrictiilor impuse
:Datele introduse corespund restrictiilor impuse
:fekhfmbabfkkh
:fekhfmbabfkkh


== Exemplul 2 ==
== Exemplul 2 ==
;Intrare
;afinin.txt
:17 20
:17 20
:TWEntyfiftEEN
:TWEntyfiftEEN
;Iesire
 
;Datele introduse nu corespund restrictiilor impuse
:Datele introduse nu corespund restrictiilor impuse




== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python3" line="1">
<syntaxhighlight lang="python3" line="1">
def cifru_afin(a, b, mesaj):
def verificare_rezultat_corect(a, b, mesaj, mesaj_criptat):
     mesaj_criptat = ""
    if not (1 <= a <= 26 and 1 <= b <= 26):
        return False
 
     if not (1 <= len(mesaj) <= 10000):
        return False
 
    if not mesaj.isalpha() or not mesaj.islower():
        return False


     for caracter in mesaj:
     if not mesaj_criptat.isalpha() or not mesaj_criptat.islower():
        if caracter.isalpha():
         return False
            if caracter.isupper():
                cod = (ord(caracter) - ord('A') + a) % 26
                mesaj_criptat += chr(cod + ord('A'))
            else:
                cod = (ord(caracter) - ord('a') + a) % 26
                mesaj_criptat += chr(cod + ord('a'))
         else:
            mesaj_criptat += caracter


     return mesaj_criptat
     return True


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:
    if verificare_rezultat_corect(a, b, mesaj, mesaj_criptat):
         f_out.write(f"{mesaj_criptat}\n")
    else:
        f_out.write("Datele introduse nu corespund restrictiilor impuse.\n")


if __name__ == "__main__":
    main()


</syntaxhighlight>
</syntaxhighlight>
== Explicatie ==

Latest revision as of 11:59, 29 December 2023

Enunt[edit | edit source]

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[edit | edit source]

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

Date de intrare[edit | edit source]

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

Date de iesire[edit | edit source]

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

Restrictii si precizari[edit | edit source]

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

Exemplul 1[edit | edit source]

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

Exemplul 2[edit | edit source]

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


Rezolvare[edit | edit source]

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

   if not (1 <= a <= 26 and 1 <= b <= 26):
       return False
   if not (1 <= len(mesaj) <= 10000):
       return False
   if not mesaj.isalpha() or not mesaj.islower():
       return False
   if not mesaj_criptat.isalpha() or not mesaj_criptat.islower():
       return False
   return True
  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:

   if verificare_rezultat_corect(a, b, mesaj, mesaj_criptat):
       f_out.write(f"{mesaj_criptat}\n")
   else:
       f_out.write("Datele introduse nu corespund restrictiilor impuse.\n")


</syntaxhighlight>