3310 - Afin

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

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