Questão
Neste episódio vamos aprender sobre a cifra de César. Este é um algoritmo muito simples para a criptografia de uma mensagem de texto. Abaixo temos o enunciado do algoritmo que vamos implementar.
Cifra de Cesar
Dado uma string não vazia de caracteres minúsculos e uma chave numérica com valor maior igual a zero, escreva uma função que retorne uma nova string obtida fazendo o shift de cada letra da string de entrada em k posições no alfabeto, onde k é a chave.
Em outras palavras, some o número da chave em cada letra da string de entrada. Por exemplo, se a chave for 3, a letra a se torna d, a letra b se torna e, e assim por diante. Você pode assumir que a string de entrada só contém letras minúsculas.
Dicas
-
Não se esqueça de tratar o caso em que a soma da chave com a letra ultrapasse o valor z, neste caso você deve voltar para o início do alfabeto, ou seja, a.
-
Entenda como a codificação de caracteres funciona, como a tabela ASCII.
-
O que acontece se o valor da chave for maior que o tamanho do alfabeto?
-
Estude a operação de módulo.
Solução
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#Time: O(n) - Space O(1)
def cesarCipherEncryption(message, key):
alphabet = "abcdefghijklmnopqrstuvwxyz"
encoded = ""
for i in message:
encodedLetterIndex = ((ord(i) - ord('a'))+key)%26
encoded += alphabet[encodedLetterIndex]
return encoded
def cesarCipherDecryption(crypto, key):
alphabet = "abcdefghijklmnopqrstuvwxyz"
decryptedMessage = ""
for i in crypto:
decodedLetterIndex = ((ord(i) - ord('a'))+26-key)%26
decryptedMessage += alphabet[decodedLetterIndex]
return decryptedMessage
message = "douglasdinizmanualdocodigo"
cryptoMessage = cesarCipherEncryption(message, 10)
decryptedMessage = cesarCipherDecryption(cryptoMessage, 10)
print(cryptoMessage)
print(decryptedMessage)