问题陈述:
ROT13是一个简单的字母替换密码,用字母表后面的字母替换字母后面的13个字母。 ROT13是Caesar密码的一个例子。
创建一个接受字符串并返回用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'虽然它应该没有改变,但我不知道我做错了什么。一些帮助将不胜感激。
答案 0 :(得分:0)
这里的问题不是最后一封信。代码的这一部分总是会在字符串中找到第一个字母出现:
letters.index(i)
因此,即使您将't'
作为输入,您也可以获得第一个索引,而不是给出'test'
中最后一个'texttttttt'
的索引 - 所有最后一个't'
将保持不变。
您必须对算法进行一些更改......
答案 1 :(得分:0)
这是一个使用translate函数的非常简单的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
答案 2 :(得分:-1)
问题不在于最后一个字母,问题在于重复的字母:
>> print rot13('abba')
noba
原因是index
功能:
index(message,i)
它返回i
中message
出现第一次的位置。解决方案是使用start
的可选index()
参数来指定搜索应从指定位置开始:
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])
...
答案 3 :(得分:-1)
您的问题来自于使用“索引”方法!
在您的示例中,第二个“t”已处理,但结果将与列表中第一个“t”位于同一位置。
我认为这里没有索引,你可以简单地从空开始,并将每个字母附加到列表的末尾,同样:
melist = []
for i in message:
if i.islower():
melist.append(lower(letters[lpos + 13]))
...