我尝试为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 _。'?
答案 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'