2615 - Caesar Crypt
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))