3310 - Afin

De la Universitas MediaWiki

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

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

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

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

# 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")