在做了一些提示搜索后,我发现我必须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 为什么我错过了几个字母??
答案 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()