如何使caeser密码使用大写和小写字母的ASCII字符。如果我只做大写字母,我的代码工作正常。这是我最接近大写和小写字母的尝试,但是如果你这样做,Z并且键= 1,它仍然会给我[字符。所以从ASCII表中,我必须排除字符91-96和任何其他不是大写或小写字母的字符。
答案 0 :(得分:1)
由于这可能是家庭作业,这里有一些伪代码。
ord('a')
设置为base
。否则 - 如果字符为大写,请将ord('A')
设置为base
。其他return char
。ord(char) - base
和key
模26。base
添加回结果。这个程序可以优化,但这可能是你自己应该做的。
答案 1 :(得分:1)
使用模数运算符可能更容易。所以你需要做的就是检查是否ch.isupper()
并减去相应的基值:
def encode(userPhrase, key):
finalmsg = userPhrase
word = ""
for ch in finalmsg:
base = ord('A') if ch.isupper() else ord('a')
new_ch = (ord(ch)-base+key) % 26 + base
word += chr(new_ch)
return word
>>> encode("HelloWorld", 10)
RovvyGybvn
答案 2 :(得分:0)
首先,ord('a') > new_ch > ord('z')
和ord('A') > new_ch > ord('Z')
都保证是假的,所以他们什么都没有。
其次,你需要单独的条件来处理under和overflow。
def encode(userPhrase, key):
finalmsg = userPhrase
word = ""
for ch in finalmsg:
new_ch = ord(ch) + int(key)
if ch.isupper() and new_ch > ord('Z'):
new_ch -= 26
elif ch.islower() and new_ch > ord('z'):
new_ch -= 26
elif ch.isupper() and new_ch < ord('A'):
new_ch += 26
elif ch.islower() and new_ch < ord('a'):
new_ch += 26
word += chr(new_ch)
return word
if __name__ == '__main__':
print(encode('azAZ', 1)) # 'baBA'
print(encode('azAZ', -1)) # 'zyZY'
答案 3 :(得分:0)
您的测试中的逻辑是倒退的。如果new_ch
在之外 A-Z或a-z范围,您只想进行减法。因此,要以最少的更改来修复代码,您可以执行以下操作:
def encode(userPhrase, key):
word = ""
key = int(key)
for ch in userPhrase:
new_ch = ord(ch) + key
if not ((ord('A') > new_ch > ord('Z')) or (ord('a') > new_ch > ord('z'))):
new_ch -= 26
word += chr(new_ch)
return word
#Test
print(encode('xyzXYZ', 3))
<强>输出强>
abcABC
但正如其他答案所提到的,有更简单的方法可以做到这一点。我可能会使用类似AChampion的代码。