2615 - Caesar Crypt

De la Universitas MediaWiki

Cerința

Se citește un text de maxim 256 caractere. Să se afișeze textul după aplicarea Cifrului Caesar.

Cifrul Caesar este o metodă de criptare în care fiecare literă este înlocuită cu o altă literă ce se află la un număr fix de poziții după aceasta în alfabet. Este numită după Julius Caesar, care o folosea în corespondența privată.

Date de intrare

Fișierul de intrare caesar.in conține:

Pe prima linie un text format din maxim 256 caractere.

Pe a doua linie un număr n reprezentând numărul de poziții.

Pe a treia linie operația ce se va aplica pe text:

encrypt pentru criptare.

decrypt pentru decriptare.

Date de ieșire

Fișierul de ieșire dbftbs.out va conține textul prelucrat.

Restricții și precizări

  • 1 ≤ n ≤ 100
  • Se va folosi alfabetul englez. Literele își păstrează capitalizarea.
  • Atenție la exemple!

Exemple

Exemplu 1

caesarin.txt

caesar

1

encrypt

dbftbsout.txt

dbftbs

Exemplu 2

caesarin.txt

dbftbs

1

decrypt

dbftbsout.txt

caesar

Exemplu 3

caesarin.txt

caeSaR

10

encrypt

dbftbsout.txt

mkoCkB

Exemplu 4

caesarin.txt

CAEsAr

10

decrypt

dbftbsout.txt

SQUiQh

Exemplu 5

caesarin.txt

If he had anything confidential to say, he wrote it in cipher, that is, by so changing the order of the 26 letters of the alphabet, that not a word could be made out.

7

encrypt

dbftbsout.txt

Pm ol ohk hufaopun jvumpkluaphs av zhf, ol dyval pa pu jpwoly, aoha pz, if zv johunpun aol vykly vm aol 26 slaalyz vm aol hswohila, aoha uva h dvyk jvbsk il thkl vba.

Rezolvare

def LM(ch):
    return 'A' <= ch <= 'Z'


def lm(ch):
    return 'a' <= ch <= 'z'


def validate_key(key):
    return 1 <= key <= 100


with open("caesarin.txt", "r") as file_in:
    s = list(file_in.readline().strip())
    n = int(file_in.readline().strip())

    # Validare cheie
    if not validate_key(n):
        print("Cheia nu este valida. Introdu o cheie intre 1 si 100.")
        exit()

    cer = file_in.readline().strip()
    n = n % 26

if cer == "encrypt":
    i = 0
    while i < len(s):
        if lm(s[i]) or LM(s[i]):
            if LM(s[i]):
                nr = ord(s[i]) + n
                if nr > ord('Z'):
                    s[i] = chr(nr - ord('Z') + ord('A') - 1)
                else:
                    s[i] = chr(nr)
            else:
                nr = ord(s[i]) + n
                if nr > ord('z'):
                    s[i] = chr(nr - ord('z') + ord('a') - 1)
                else:
                    s[i] = chr(nr)
        i += 1

    with open("dbftbsout.txt", "w") as file_out:
        file_out.write("".join(s))
else:
    i = 0
    while i < len(s):
        if LM(s[i]) or lm(s[i]):
            if LM(s[i]):
                s[i] = chr(ord(s[i]) - n)
                if s[i] < 'A':
                    s[i] = chr(ord(s[i]) + ord('Z') - ord('A') + 1)
            else:
                s[i] = chr(ord(s[i]) - n)
                if s[i] < 'a':
                    s[i] = chr(ord(s[i]) + ord('z') - ord('a') + 1)
        i += 1

    with open("dbftbsout.txt", "w") as file_out:
        file_out.write("".join(s))