我是从这里做这个练习的。我做了一个解决方案,但不由得觉得可以用更少的行来完成。我对python非常陌生,所以我不太确定这些小捷径。
def shift(S, n):
word = ''
for i in S:
if ord(i) == 32:
word += ' '
elif ord(i)+n > 90:
a = n-(90-ord(i))+64
word += chr(a)
else:
word +=chr(ord(i)+n)
return word
def TGS(x): # Total goodness of string
TGC = 0 # Total goodness of character
for i in x:
if ord(i) == 32:
continue
TGC += letterGoodness[ord(i)-65]
return TGC
A = input()
LOSS = [shift(A,n) for n in range (1,27)] # List of shifted strings
LOTG = [TGS(x) for x in LOSS]
a = LOTG.index(max(LOTG))
print(LOSS[a])发布于 2014-08-29 19:56:40
ord('A'),90是ord('Z');所以要明确地说。沿着同样的思路,如果我==‘':看起来比如果ord(i) == 32:caesar_decrypt(ciphertext, shift)而不是shift(S, n)。A、a等也是如此。elif和else的shift的不对称情况:a= n-(90-ord(i))+64 word += chr(a)是完全违反直觉的。我建议我在S:如果ord(i) == 32:单词+=‘继续a= ord(i) +n如果a> ord('Z'):a -= ord('Z') - ord('A')字+=chr(a)发布于 2014-08-29 20:28:35
虽然您没有义务使用它,这里是一个较短的版本的shift函数。
附有评论:
def shift(s,n):
word=''
for i in s:
x=ord(i)
y=x+n
if 64<x<91:
word+=chr(y) if y<91 else chr(65+y-90)
else:
word+=' '
return word解释:
y是ascii值加上shift值。
64<x<91检查该字符是否是我们要寻找的字符。
如果移动字符不超过'Z',则word+=chr(y) if y<91 else chr(65+y-90)将添加移位字符,否则将等于环绕值。
如果您不想使用条件表达式,也可以这样做:
def shift(s,n):
word=''
for i in s:
x=ord(i)
y=x+n
if 64<x<91:
if y<91:
word+=chr(65+y-90)
else:
word+=chr(y)
else:
word+=' '
return word发布于 2014-08-29 22:30:54
让我们看看。
结果:
def shift(string,n):
if n<0:
n = n%26 + 26
word = ''
for c in string:
if 'A' <= c <= 'Z':
c = chr((ord(c)-ord('A')+n)%26 + ord('A'));
if 'a' <= c <= 'z':
c = chr((ord(c)-ord('a')+n)%26 + ord('a'));
word += c
return word
print shift("Hello, World!", 3)
print shift("Khoor, Zruog!", -3)https://codereview.stackexchange.com/questions/61503
复制相似问题