Python - ASCII exercice

Hi guys, so I have this exercise, outside of codeacademy and I’m struggling really hard to get it right, if someone would like to help me I’d be very glad, so here it is:
Create a function to encrypt a message. Your function must displace each alphabet letter according to a number. For example, if the number is 3 then “A” becomes “D” and “B” becomes “E”. For that, you can use the ASCII codification, using the ord() and chr() functions.
Observations: whitespaces and special characters must not be modified. Also any displacement in the letter “Z” or “z” with the number 3, for example, must be turned into “c” or “C”.

This is my code:

def cripto(msg, key):
   code = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
   'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
   
   string = []
   
   i = 0
   while i < len(msg):
       if (msg[i] in code):
           number = int(ord(msg[i]))
           character = chr(number + key)
           string.append(character)
       else:
           letter = msg[i]
           string.append(letter)
   
       i += 1
   stri = ""
   strnova = stri.join(string)
   return(strnova)
print(cripto('Computer Programming', 7))

the output was this: Jvtw|{ly Wyvnyhttpun
Which is wrong because | and { shouldn’t be there, the program only wants the alphabet letters.

Maybe you should try outputting the values that ord() produces so you know what you’re working with. With that can you see why characters are not what you expect? If you’re not already familiar with it then you can look up an ASCII table for an overview of the values for the relevant characters.

1 Like

I actually did that and I realized that the alphabet letters when converted with ord() goes till the number 122, after that the outcome will be only special characters. I want to know how to stop those special characters after the letter z or number 122.

Out of interest, which lesson/exercise is this? Please post a link to the landing page.

the lesson is actually in portuguese so I had to translate it. But here you go:
Implemete uma função para criptografar uma mensagem. A função deve deslocar cada letra do alfabeto da sua posição um número fixo de lugares de acordo com um numero: por exemplo, se a chave tiver o valor 3, então A torna-se D, B torna-se E, etc.

Para isso, deve ser utilizado a codificação ASCII. A codificação ASCII é usada para representar textos em computadores. Nela, cada caracter é representado por um número inteiro. Além disso, os caracteres são codificados em ordem alfabética. Você pode usar a função pré-definida ord(), que converte um caractere em um código numérico e a função pré-definida chr(), que converte códigos numéricos em caracteres. Por exemplo, ao utilizar ord(“A”), o número inteiro 65 é retornado. Ao utilizar char(65), o caractere “A” é retornado.

Supondo que se deseja encriptar a mensagem “Programação de Computadores” e sua chave tenha o valor 3, a mensagem cifrada deve ser “Surjudpdçãr gh Frpsxwdgruhv”.

Observação : espaços em branco, pontuações e letras com acentuação não devem ser modificados. Qualquer deslocamento no caractere “Z” ou “z” deve retornar ao início do alfabeto. Por exemplo: seja o valor 3, “z” e “Z” devem ser transformados em “c” e “C”, respectivamente.

This looks like a problem that can be solved with modulo.

Just scratched this together and haven’t extensively tested it, but the proof of concept is there.

>>> alpha = [*"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"]
>>> k = 3
>>> letter = 'A'
>>> p = alpha.index(letter)
>>> o = 26 if p > 25 else 0
>>> c = (p + k) % 26 + o
>>> alpha[c]
'D'
>>> letter = 'Z'
>>> p = alpha.index(letter)
>>> o = 26 if p > 25 else 0
>>> c = (p + k) % 26 + o
>>> alpha[c]
'C'
>>> 

This topic was automatically closed 41 days after the last reply. New replies are no longer allowed.