Search code examples
pythonrot13

Rot13 function but the code can't translate if letter clue is over 122


The answers come one by one but if the value is over 122 then the following code doesn't work.

def rotate_word13(line, num):
    for x in line:
        a = ord(x)
        a = ord(x) + num
        print(a)

        if a >= 122:
            e = a - 122
            print(e)
            x = chr(e)
            print(x)
        else:
            x = chr(a)
            print(x)

rotate_word13("hello", 13)
rotate_word13("r", 13)

Here is the result. As you can see it works only if ord is less than 122 after it's been subtracted.

117
u
114
r
121
y
121
y
124
2
127
5

Solution

  • You seem to be trying to implement the ROT13 cypher.

    You need to take account of upper- and lower-case letters. Simply find where the letter is in an ordered list of letters, add 13 to that index and then modulo by 26.

    Like this:

    from string import ascii_lowercase as L, ascii_uppercase as U
    
    def rot13(s):
        r = []
        for c in s:
            if (i := U.find(c)) >= 0:
                r.append(U[(i + 13) % 26])
            elif (i := L.find(c)) >= 0:
                r.append(L[(i + 13) % 26])
            else:
                r.append(c)
        return ''.join(r)
    
    print(rot13('Why did the chicken cross the road'))
    

    Output:

    Jul qvq gur puvpxra pebff gur ebnq