[英]Python 2.7: ROT13 letter substitution cipher
问题陈述:
ROT13是一种简单的字母替换密码,它将字母中的字母替换为后面的13个字母。 ROT13是凯撒密码的一个示例。
创建一个接受字符串并返回用Rot13加密的字符串的函数。 如果字符串中包含数字或特殊字符,则应按原样返回它们。 像原来的Rot13“实现”中一样,仅应转换来自拉丁语/英语字母的字母。
请注意,在Python中使用“编码”被认为是作弊行为。
我的代码:
from string import *
def rot13(message):
melist = list(message)
for i in message:
lpos = index(letters,i)
if i.islower():
print lpos
melist[index(message,i)] = lower(letters[lpos + 13])
elif i.isupper():
try:
melist[index(message,i)] = upper(letters[lpos + 13])
except IndexError:
melist[index(message,i)] = upper(letters[lpos + 13 - 52])
return ''.join(melist)
这个东西可以很好地转换字符串,除了最后一个字母
例如,如果您这样做:
>>> rot13('test')
'grft'
最后一个字符“ t”虽然没有变化,但没有改变,我不知道我在哪里做错了。 一些帮助将不胜感激。
这里的问题不是最后一个字母。 这部分代码将始终查找字符串中字母的首次出现:
letters.index(i)
因此,而不是给予最后的索引't'
的'test'
,你得到的第一个指数,即使你给'texttttttt'
输入-所有过去的't'
将保持不变。
您必须对算法进行一些更改...
这是使用翻译功能的rot13的非常简单的版本。
import string
def rot13(message):
norm=string.maketrans('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', \
'nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM')
return message.translate(norm)
print rot13("now is the time FOR ALL GOOD")
输出是
abj vf gur gvzr SBE NYY TBBQ
问题不是最后一个字母,而是重复的字母:
>> print rot13('abba')
noba
原因是index
函数:
index(message,i)
它返回i
在message
第一次出现的位置。 一种解决方案是对index()
使用可选的start
参数,以指定搜索应从指定位置开始:
for j,i in enumerate(message):
lpos = index(letters,i)
if i.islower():
print lpos
// this will find the correct position of the current occurence of i
melist[index(message,i,j)] = lower(letters[lpos + 13])
...
您的问题来自使用“索引”方法!
在您的示例中,处理了第二个“ t”,但结果将与列表中第一个“ t”位于相同的位置。
我认为这里的索引没有用,您可以简单地以空开头,然后将每个字母附加到列表的末尾,同样:
melist = []
for i in message:
if i.islower():
melist.append(lower(letters[lpos + 13]))
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.