函数rrot(rot,s)将整数rot和字符串s作为输入并返回s的副本,s被反转然后被rot转移

时间:2015-11-01 21:57:00

标签: python string encryption caesar-cipher

我尝试为Caesar Cipher实现一个类似的编码方案,用于只包含大写字母,下划线和句点的字符串。使用字母顺序执行旋转: ABCDEFGHIJKLMNOPQRSTUVWXYZ_。

到目前为止

Mycode:

def rrot(rot, s):
    'returns reverse rotation by rot of s'
    res = ''
    for c in s:
        x = ord(c)
        res += chr(x + rot)
        copy = res[::-1]
    return copy

输出的一些例子是:

>>> rrot(1, 'ABCD')
'EDCB'
>>> rrot(3, 'YO_THERE.')
'CHUHKWBR.'
>>> rrot(1, '.DOT')
'UPEA'
>>> rrot(1, 'SNQZDRQDUDQ')
'REVERSE_ROT'

但是当跑步时,它会在整个字母表中运行,包括符号{[/等等。我得到了正确的字母移位但是得到了不需要的符号。我的输出不正确:

>>> rrot(3, 'YO_THERE.')
'1HUHKWbR\\'
>>> rrot(1, 'SNQZDRQDUDQ')
'REVERSE[ROT'

但这是正确的:

>>> rrot(1, 'ABCD')
'EDCB'

如何让它遵循字母的字母顺序' ABCDEFGHIJKLMNOPQRSTUVWXYZ _。'?

1 个答案:

答案 0 :(得分:1)

您的代码可以简单修复:

def rrot(rot, s):
    'returns reverse rotation by rot of s'
    res = ''
    for c in s:
        x = ord(c)
        res += chr(x + rot)
        copy = res[::-1]
    return copy

您可以通过替换以下内容来修复它以使用其他字符顺序:

    x = ord(c)
    res += chr(x + rot)

说:

    x = alphabet.index(c)
    res += alphabet[(x + rot) % len(alphabet)]

考虑:

alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_.'

def rrot(rot, s):
    'returns reverse rotation by rot of s'
    res = ''
    for c in s:
        x = alphabet.index(c)
        res += alphabet[(x + rot) % len(alphabet)]
        copy = res[::-1]
    return copy

使用那些不好的例子:

>>> rrot(3, 'YO_THERE.')
'1HUHKWbR\\'
>>> rrot(1, 'SNQZDRQDUDQ')
'REVERSE[ROT'

这些例子的结果如下:

>>> rrot(3, 'YO_THERE.')
'CHUHKWBR.'
>>> rrot(1, 'SNQZDRQDUDQ')
'REVERSE_ROT'

另一种方法是建立一个翻译表,如:

trans = dict(zip(alphabet, alphabet[rot:] + alphabet[:rot]))

一旦在循环之外,然后使用:

    res += trans[c]

像这样:

alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_.'

def rrot(rot, s):
    'returns reverse rotation by rot of s'
    trans = dict(zip(alphabet, alphabet[rot:] + alphabet[:rot]))
    res = ''
    for c in s:
        res += trans[c]
        copy = res[::-1]
    return copy

结果相同:

>>> rrot(3, 'YO_THERE.')
'CHUHKWBR.'
>>> rrot(1, 'SNQZDRQDUDQ')
'REVERSE_ROT'