Decoding the Ceasar Cipher Ends Up with Logic Error

I’m a complete beginner when it comes to coding, I was training in CodeWars when I came across this question:

The soldiers of a country use ceasar cipher for messaging. Only letters are changed and everything else is not touched in these messages (like “!” and space). Each message is split into 4 or 5 parts and each part is carried by one runner. The first part starts with 2 letters: The first one shows a random letter and the second one is the same letter that has been changed by shifting (so that the soldiers know the number of the shift). Now write a code for decoding and encoding the message I should have known that you would have a perfect answer for me!!!

The encoding function works. However, the following function that I wrote for decoding does not. I enter the "ijJ tipvme ibw", "f lopxo uibu z", "pv xpvme ibwf ", "b qfsgfdu botx", "fs gps nf!!!" message and I’m supposed to get I should have known that you would have a perfect answer for me!!!, but instead I get some nonsense message saying 'ž~ ¨¤ª¡™ –«', ' "𠣤¬£ ©–© ®', ' "¤ª ¬¤ª¡™ –«š ', ' "– ¥š§›š˜© –£¨¬', ' "š§ ›¤§ ¢š!!!

I import re first:

import re

Here’s the function:

def decode(arr):
    arr = str(arr) #turn what we have into str
    array = list(re.split('",', arr)) #get rid of the ' ", ' between every part so that
                                # it will be a single whole messege in the end and also turn it into
                                #a list in which every item is a single part

    decoded_messege = ""

    first_messege = list(array[0]) #turns the first part into a list of letters
    letter_shift = ord(first_messege[1]) - ord(first_messege[0]) #realizes the number of shift

    for messege in array:
        for letter in messege:
            if (ord(letter) > 122 or ord(letter) < 65): #the letter is not an alphabet (a space or !)
                decoded_messege += letter

            else: #the letter is an alphabet
                decoded_messege += chr(ord(letter) - letter_shift) #the ascii code is the current ascii number
                                                                #minus the shift

    decoded_message = decoded_messege[2:] #ignore the first two letters that are
                                        #only for showing shift and don't matter in the message
    return decoded_messege

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

The problem is that you’re taking into account the first two characters to calculate the shift: "–>", which is 0. Change it to arr = str(arr)[2:]
Also, the return should be at the same level of the first loop.

import re


def decode(arr):
    arr = str(arr)[2:] #turn what we have into str
    array = list(re.split('",', arr)) #get rid of the ' ", ' between every part so that
                                    # it will be a single whole messege in the end and also turn it into
                                    #a list in which every item is a single part

    decoded_messege = ""

    first_messege = list(array[0]) #turns the first part into a list of letters
    letter_shift = ord(first_messege[1]) - ord(first_messege[0]) #realizes the number of shift

    for messege in array:
        for letter in messege:
            if letter != '"':
                # print(letter)
                if (ord(letter) > 122 or ord(letter) < 65): #the letter is not an alphabet (a space or !)
                    decoded_messege += letter
                else: #the letter is an alphabet
                    decoded_messege += chr(ord(letter) - letter_shift) #the ascii code is the current ascii number                                                                    #minus the shift
        decoded_message = decoded_messege[2:] #ignore the first two letters that are
                                            #only for showing shift and don't matter in the message
    return decoded_messege

print(decode('""ijJ tipvme ibw", "f lopxo uibu z", "pv xpvme ibwf ", "b qfsgfdu botx", "fs gps nf!!!""'))
# hiI should hav e known that y ou would have  a perfect answ er for me!!!
```


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x