<pythonchallenge.com>----Lv1

http://www.pythonchallenge.com/

一个有趣的python学习网站,就是在给出的图片和提示信息的帮助下,利用python解谜,然后进入下一关。

第0关图片显示2的38次方。

可以猜想2**38=274877906944与下一关的网站有关,于是将url改为274877906944.html进入第一关。

在第一关看见如下图片

以及一段字符串:

msg='''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.
'''

 

由图可以看出这应该是简单的字符转换解码,将原字符换为其后的两个字符。

于是我们可以利用translate方法来处理这个问题。

# -*- coding: utf-8 -*-
import string
msg='''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.'''

instr="abcdefghijklmnopqrstuvwxyz"
outstr="cdefghijklmnopqrstuvwxyzab"

table=string.maketrans(instr, outstr)
astr=msg.translate(table)
print(astr)
 网站给出的答案转换表写得比我这个菜鸟专业多了:table = string.maketrans(string.ascii_lowercase,string.ascii_lowercase[2:]+string.ascii_lowercase[:2])

输出为:

>>> 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.

 又输出可知要我们应用到url上。

map----ocr

于是我们将url地址改为ocr.html进入到下一关。

在这关我们学习了translate方法的使用。

translate方法的主要作用就是进行字符的替换,使用方法如下:

        str.translate(strtable,[delete])

str是需要被转换的字符串,strtable是转换表,delete是一个可选字符串参数,其作用是过滤掉str里指定字符。

strtable通过maketrans方法获得,调用方式如下:

  strtable=string.maketrans(instr,outstr) 

instr是原始字符,outstr是转换后的字符。其中len(instr)=len(outstr)。

于是,在看看这个封装的函数,在处理字符转换的时候就很省事了。

#代码转自http://blog.csdn.net/lingedeng/article/details/7045443
def translator(frm='', to='', delete='', keep=None):  
    if len(to) == 1:  
        to = to * len(frm)  
      
    trans = string.maketrans(frm, to)  
    if keep is not None:  
        trans_all = string.maketrans('', '')  
        #keep.translate(trans_all, delete),从要保留的字符中剔除要删除的字符   
        #trans_all.translate(trans_all, keep.translate(trans_all, delete)),从翻译表中删除要保留的字符,即取保留字符的补集   
        delete = trans_all.translate(trans_all, keep.translate(trans_all, delete))  
          
    def translate(s):  
        return s.translate(trans, delete)  
          
    return translate  

 

 

posted @ 2013-10-29 20:42  洛卜哒  阅读(205)  评论(0编辑  收藏  举报