2615 - Caesar Crypt: Difference between revisions

From Bitnami MediaWiki
Andrada378 (talk | contribs)
No edit summary
Andrada378 (talk | contribs)
No edit summary
 
Line 1: Line 1:
'''<u>''<big>Cerința</big>''</u>'''
== <big>Cerința</big> ==
 
Se citește un text de maxim 256 caractere. Să se afișeze textul după aplicarea Cifrului Caesar.
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ă.
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ă.


<big>'''''<u>Date de intrare</u>'''''</big>
== <big>Date de intrare</big> ==
 
Fișierul de intrare caesar.in conține:
Fișierul de intrare caesar.in conține:


Line 19: Line 17:
decrypt pentru decriptare.
decrypt pentru decriptare.


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


Restricții și precizări
== Restricții și precizări ==


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


Se va folosi alfabetul englez. Literele își păstrează capitalizarea.
== Exemple ==


Atenție la exemple!
=== Exemplu 1 ===
 
'''caesarin.txt'''
''<u>Exemple</u>'':
 
Exemplu #1
 
caesar.in


caesar
caesar
Line 43: Line 37:
encrypt
encrypt


dbftbs.out
'''dbftbsout.txt'''


dbftbs
dbftbs


Exemplu #2
=== Exemplu 2 ===
 
'''caesarin.txt'''
caesar.in


dbftbs
dbftbs
Line 57: Line 50:
decrypt
decrypt


dbftbs.out
'''dbftbsout.txt'''


caesar
caesar


Exemplu #3
=== Exemplu 3 ===
 
'''caesarin.txt'''
caesar.in


caeSaR
caeSaR
Line 71: Line 63:
encrypt
encrypt


dbftbs.out
'''dbftbsout.txt'''


mkoCkB
mkoCkB


Exemplu #4
Exemplu 4


caesar.in
'''caesarin.txt'''


CAEsAr
CAEsAr
Line 85: Line 77:
decrypt
decrypt


dbftbs.out
'''dbftbsout.txt'''


SQUiQh
SQUiQh


<u>'''''Exemplu #5'''''</u>
== Exemplu 5 ==
 
'''caesarin.txt'''
caesar.in


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.
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.
Line 99: Line 90:
encrypt
encrypt


dbftbs.out
'''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.
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.


<u>'''''Rezolvare'''''</u>
== Rezolvare ==
 
<syntaxhighlight lang="python">
def cifrul_caesar(text, shift):
def LM(ch):
 
    return 'A' <= ch <= 'Z'
    rezultat = ""
 
    for caracter in text:
 
        if caracter.isalpha():
 
            # Verificăm dacă caracterul este literă
 
            baza = ord('a') if caracter.islower() else ord('A')
 
            rezultat += chr((ord(caracter) - baza + shift) % 26 + baza)
 
        else:
 
            # Caracterul nu este literă, îl păstrăm nemodificat
 
            rezultat += caracter
 
    return rezultat
 
def main():
 
    # Citim datele din fișierul de intrare
 
    with open('caesarin.txt', 'r') as fisier:
 
        text = fisier.readline().strip()
 
        shift = int(fisier.readline().strip())
 
        operatie = fisier.readline().strip()
 
    # Aplicăm cifrul Caesar în funcție de operație
 
    if operatie == 'encrypt':


        rezultat = cifrul_caesar(text, shift)


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


        rezultat = cifrul_caesar(text, -shift)


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


        print("Operație necunoscută")


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


    # Scriem rezultatul în fișierul de ieșire
    # Validare cheie
    if not validate_key(n):
        print("Cheia nu este valida. Introdu o cheie intre 1 si 100.")
        exit()


    with open('dbftbs.out', 'w') as fisier:
    cer = file_in.readline().strip()
    n = n % 26


        fisier.write(rezultat)
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


if __name__ == "__main__":
    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


    main()
    with open("dbftbsout.txt", "w") as file_out:
        file_out.write("".join(s))
</syntaxhighlight>

Latest revision as of 14:03, 5 January 2024

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>