使用索引范围搜索 ascii
Using an index range to search ascii
我正在尝试搜索 ascii 索引以编写范围为 >= 32 且 <= 126 的凯撒密码程序。当我到达最后一个打印输出时,我得到了一些不在该范围内的字符.我尝试了 for 循环和 while 循环,但总是出错。
如果我没有正确post,我深表歉意。这是我的第一个post。
感谢您的帮助。
def cipher(phrase,shift):
x = list(str(phrase))
xx = ''.join(list(str(phrase)))
yy = []
print(x)
for c in xx:
yy.append(chr(ord(c)+shift))
return ''.join(yy)
print(cipher('ABCDE', 97 - 65))
print(cipher('abcde', 65 - 97))
print(cipher(' !\"#$', 95))
我的输出是:
['A', 'B', 'C', 'D', 'E']
abcde
['a', 'b', 'c', 'd', 'e']
ABCDE
[' ', '!', '"', '#', '$']
这应该可行(请注意,我稍微清理了您的代码):
def cipher(phrase, shift):
x = list(str(phrase))
yy = ''
print(x)
for c in phrase:
dec = ord(c) + shift
while dec < 32:
dec = 127 - (32 - dec)
while dec > 126:
dec = 31 + (dec - 126)
yy += (chr(dec))
return yy
print(cipher('ABCDE', 97 - 65))
print(cipher('abcde', 65 - 97))
print(cipher(' !\"#$', 95))
输出为:
['A', 'B', 'C', 'D', 'E']
abcde
['a', 'b', 'c', 'd', 'e']
ABCDE
[' ', '!', '"', '#', '$']
!"#$
我很好奇找到一个使用范围不是从 0 开始的模的解决方案,所以这里是:
def cipher(phrase, shift):
"""Shift phrase; return original and shifted versions."""
collector = []
for c in phrase:
i = ord(c)
if i < 32 or i > 126:
raise ValueError('Char not in range [32, 126]: %s' % c)
# Shift into range [0, 95)
i -= 32
# Apply cipher shift
i += shift
# Push the shifted value back into [0, 95) if necessary
i %= 95
# Shift back into range [32, 126]
i += 32
# Convert to char
d = chr(i)
collector.append(d)
return phrase, ''.join(collector)
print(cipher('ABCDE', 97 - 65))
# -> ('ABCDE', 'abcde')
print(cipher('abcde', 65 - 97))
# -> ('abcde', 'ABCDE')
print(cipher(' !"#$', 95))
# -> (' !"#$', ' !"#$')
我正在尝试搜索 ascii 索引以编写范围为 >= 32 且 <= 126 的凯撒密码程序。当我到达最后一个打印输出时,我得到了一些不在该范围内的字符.我尝试了 for 循环和 while 循环,但总是出错。
如果我没有正确post,我深表歉意。这是我的第一个post。
感谢您的帮助。
def cipher(phrase,shift):
x = list(str(phrase))
xx = ''.join(list(str(phrase)))
yy = []
print(x)
for c in xx:
yy.append(chr(ord(c)+shift))
return ''.join(yy)
print(cipher('ABCDE', 97 - 65))
print(cipher('abcde', 65 - 97))
print(cipher(' !\"#$', 95))
我的输出是:
['A', 'B', 'C', 'D', 'E']
abcde
['a', 'b', 'c', 'd', 'e']
ABCDE
[' ', '!', '"', '#', '$']
这应该可行(请注意,我稍微清理了您的代码):
def cipher(phrase, shift):
x = list(str(phrase))
yy = ''
print(x)
for c in phrase:
dec = ord(c) + shift
while dec < 32:
dec = 127 - (32 - dec)
while dec > 126:
dec = 31 + (dec - 126)
yy += (chr(dec))
return yy
print(cipher('ABCDE', 97 - 65))
print(cipher('abcde', 65 - 97))
print(cipher(' !\"#$', 95))
输出为:
['A', 'B', 'C', 'D', 'E']
abcde
['a', 'b', 'c', 'd', 'e']
ABCDE
[' ', '!', '"', '#', '$']
!"#$
我很好奇找到一个使用范围不是从 0 开始的模的解决方案,所以这里是:
def cipher(phrase, shift):
"""Shift phrase; return original and shifted versions."""
collector = []
for c in phrase:
i = ord(c)
if i < 32 or i > 126:
raise ValueError('Char not in range [32, 126]: %s' % c)
# Shift into range [0, 95)
i -= 32
# Apply cipher shift
i += shift
# Push the shifted value back into [0, 95) if necessary
i %= 95
# Shift back into range [32, 126]
i += 32
# Convert to char
d = chr(i)
collector.append(d)
return phrase, ''.join(collector)
print(cipher('ABCDE', 97 - 65))
# -> ('ABCDE', 'abcde')
print(cipher('abcde', 65 - 97))
# -> ('abcde', 'ABCDE')
print(cipher(' !"#$', 95))
# -> (' !"#$', ' !"#$')