【原创】pythonchalleng——第1题

网址:http://www.pythonchallenge.com/pc/def/map.html,如果大家访问不了,可以看看下面的网站截图。如果看不清楚,可以保存该图片。

        可以看出,上面的图片已经给我们了一些提示,即

    • K –> M
    • O –> Q
    • E  –> G

让我们看一下字母表,如下图所示。

大家发现什么规律没有?就是左面的字符与右面的字符相差2个位置,这也属于一种加密方式。好了,我们只需要对图片下面的字符串按照这种加密方式处理一下,我们应该会发现一些东西。

g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.

现在给出我的想法:

1 设置好常规字符表,保存到字符串中,例如alphabet="abcdefghijklmnopqrstuvwxyz"

2 将提示中的字符串也保存起来,例如strMeg="g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."

3 用一个for循环一次处理一个字符,处理方法是从alphabet中找到对应的字符,并按照最开始的加密规则获取新的字符,连接到结果字符串上。

代码如下:

 
   
alphabet="abcdefghijklmnopqrstuvwxyz" 
strMeg="g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj." 
length=len(strMeg) 
result="" 
for len in range(length): 
    if(strMeg[len].isalpha()): 
        index=alphabet.find(strMeg[len]) 
        result+=alphabet[(index+2)%26] 
    else: 
        result+=strMeg[len] 
print result

这种方法十分笨,因为每处理一个字符的时候,都需要find一次,时间代价过高。不过值得庆幸的是最终还是能够得到正确的结果。结果如下:

i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and that's why this text is so long. using string.maketrans() is recommended. now apply on the url.

看到翻译后的结果,发现出题者给我们一个很好的提示:使用string.maketrans()。我们在PyTutorial中搜索,可以看到string.maketrans的简单描述。根据出题者的提示,我们重新编写代码。新的代码简单得多,我们来欣赏一下:

 
   
import string 
fromTable="abcdefghijklmnopqrstuvwxyz" 
toTable="cdefghijklmnopqrstuvwxyzab" 
strMeg="g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj." 
aTOc=string.maketrans(fromTable, toTable) 
print strMeg.translate(aTOc)

得到的结果如下:

i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and that's why this text is so long. using string.maketrans() is recommended. now apply on the url.

第二种方法看起来更简单,而且充分利用的python语言的内置特性,效率高!

        哦,差点忘了说怎么进入第二题了。根据出题者的提示信息“ now apply on the url.”我们把url中的“map”使用该方法处理一下,得到的结果是ocr。将url中的“map”替换为“ocr”,顺利进入第二。

你可能感兴趣的:(Python编程)