首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >凯撒密码演习

凯撒密码演习
EN

Code Review用户
提问于 2014-08-29 19:24:42
回答 3查看 2.9K关注 0票数 6

我是从这里做这个练习的。我做了一个解决方案,但不由得觉得可以用更少的行来完成。我对python非常陌生,所以我不太确定这些小捷径。

代码语言:javascript
复制
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])
EN

回答 3

Code Review用户

回答已采纳

发布于 2014-08-29 19:56:40

  • 神奇数字。尽量避开他们。65是真正的ord('A'),90是ord('Z');所以要明确地说。沿着同样的思路,如果我==‘':看起来比如果ord(i) == 32:
  • 命名尝试使用描述性名称。我更喜欢caesar_decrypt(ciphertext, shift)而不是shift(S, n)Aa等也是如此。
  • 精简I真的偶然发现了elifelseshift的不对称情况: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)
票数 4
EN

Code Review用户

发布于 2014-08-29 20:28:35

虽然您没有义务使用它,这里是一个较短的版本的shift函数。

附有评论:

代码语言:javascript
复制
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)将添加移位字符,否则将等于环绕值。

编辑

如果您不想使用条件表达式,也可以这样做:

代码语言:javascript
复制
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
票数 3
EN

Code Review用户

发布于 2014-08-29 22:30:54

让我们看看。

  1. 我觉得S有点矮。我会用一个更长的词。
  2. 比较字符比数字等价物更易读。
  3. 您可以通过添加if n<0: n= n%26+26来处理n的负值
  4. 你可以忽略任何非字母字母,并保留标点符号。
  5. 您还可以在单独的测试中移动小写字母。
  6. 模块化算法可以用来以循环的方式移动一个值。但是你需要把你的字母转换成0..25范围内的整数。又回来了。

结果:

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/61503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档