函数 rrot(rot, s) 以整数 rot 和字符串 s 以及 returns s 的副本作为输入,其中 s 被反转,然后被 rot 移位

Function rrot(rot, s) that takes as input an integer rot and a string s and returns a copy of s that s is reversed and then shifted by rot

我正在尝试对仅包含大写字母、下划线和句点的字符串实施与凯撒密码类似的编码方案。旋转将使用字母顺序执行: ABCDEFGHIJKLMNOPQRSTUVWXYZ_。

到目前为止我的代码:

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_.'?

您的代码可以简单地修复:

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'

另一种方法是构建翻译table,例如:

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'