2615 - Caesar Crypt

From Bitnami MediaWiki

Cerința[edit | edit source]

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

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

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

Restricții și precizări[edit | edit source]

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

Exemple[edit | edit source]

Exemplu 1[edit | edit source]

caesarin.txt

caesar

1

encrypt

dbftbsout.txt

dbftbs

Exemplu 2[edit | edit source]

caesarin.txt

dbftbs

1

decrypt

dbftbsout.txt

caesar

Exemplu 3[edit | edit source]

caesarin.txt

caeSaR

10

encrypt

dbftbsout.txt

mkoCkB

Exemplu 4

caesarin.txt

CAEsAr

10

decrypt

dbftbsout.txt

SQUiQh

Exemplu 5[edit | edit source]

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

<syntaxhighlight lang="python"> 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))

</syntaxhighlight>