Python挑战 - #3 *剧透*

时间:2015-07-27 17:04:18

标签: python loops

在做了一些提示搜索后,我发现我必须import re并使用正则表达式。答案是“链表”。 http://www.pythonchallenge.com/pc/def/equality.html

但我很好奇我之前尝试解决它的错误是什么?

tekstas = "the string that i need to decode"

possible_solution = []

for i in range(0, len(tekstas)):
    if ((ord(tekstas[i]) < 123) and (ord(tekstas[i]) > 96)) and ((ord(tekstas[i-1])) > 64) and ((ord(tekstas[i-1])) < 90) \
    and ((ord(tekstas[i-2])) > 64) and ((ord(tekstas[i-2])) < 90) and ((ord(tekstas[i-3])) > 64) and ((ord(tekstas[i-3])) \
    < 90) and ((ord(tekstas[i+1])) > 64) and ((ord(tekstas[i+1])) < 90) and ((ord(tekstas[i+2])) > 64) and \
    ((ord(tekstas[i+2])) < 90) and ((ord(tekstas[i+3])) > 64) and ((ord(tekstas[i+3])) < 90):
         possible_solution.append(tekstas[i-4]+tekstas[i-3]+tekstas[i-2]+tekstas[i-1]+tekstas[i]+tekstas[i+1]+tekstas[i+2]+\
            tekstas[i+3]+tekstas[i+4])

for i in range (0, len(possible_solution)):
    candidate = possible_solution[i]
    if (ord(candidate[0]) < 123) and (ord(candidate[0]) > 96) and (ord(candidate[8]) < 123) and (ord(candidate[8]) > 96):
        print(candidate[1:8])

我得到的答案: IQNlQSL OEKiVEY CNDeHSB OIXdKBF CJAsACF KWGtIDC

我从中得到的小写字母:liedst 为什么我错过了几个字母??

1 个答案:

答案 0 :(得分:2)

您要排除Z,因为您使用(ord(tekstas[i-2])) < 90而非(ord(tekstas[i-2])) < 91测试大写字母。

请注意,您根本不需要使用ord(),您可以直接与字母进行比较:

tekstas[i-2] < '['

或者可能更直接识别:

tekstas[i-2] <= 'Z'

您也不需要单独的tekstas[i-2] >= 'A' and tekstas[i-2] <= 'Z'测试;您可以使用 chain 进行比较:

'A' <= tekstas[i-2] <= 'Z'

最简单的方法是使用str.isupper() method

tekstas[i-2].isupper()

对于默认语言环境,只有当字符串中的所有字符都是大写ASCII字母时才为真。

这意味着您可以一次测试多个字母;与str.islower()一起,您的第一次if测试可以简化为:

tekstas[i].islower() and (tekstas[i - 3:i] + tekstas[i + 1:i + 4]).isupper()