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)