python challenge 答案详解~(1)

很想学好python,看到一个教程说下面这个网站很有意思,于是就过去咯。

http://www.pythonchallenge.com/

这里主要还是抱着学习的心态给出答案,因此涉及到的函数都会做一个了解。


第0关:

就是2的38次方,计算后把结果替换到地址栏里就好了。

>>> 2**38
274877906944


第1关:

这是一个解谜游戏。

图片给出了替换的提示,可以很简单的看出来,密文就是明文后移两个字母。

因此用python解密:

 

<span style="font-size:14px;"> import string
>>> 
>>> str="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."
>>> 
>>> transfun=string.maketrans('abcdefghijklmnopqrstuvwxyz','cdefghijklmnopqrstuvwxyzab')
>>> print str.translate(transfun)
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.
>>> print 'map'.translate(transfun)
ocr

</span>


其中maketrans函数用来做一个替换的映射。然后对目标字符串使用这个映射translate得到明文。最后按提示将转换应用在url上得到下一步的网址。


第2关:

按照提示,查看网页源代码,最下面是一大堆乱码,我们要从中获取自己的信息。

因此将乱码复制到文件中,命名为“2.tmp”,然后利用正则表达式从中提取字母。

<span style="font-size:14px;">import re

f=open('2.tmp','r')
str=f.read()
res=re.findall(r"[a-zA-Z]", str)
print ''.join(res)

</span>
findall函数返回的总是正则表达式在字符串中所有匹配结果的列表。


第3关:

提示意思是小蜡烛两边都有三个大蜡烛。

于是查看网页源码,那一堆乱码中要找出一个小写字母两边被连续三个大写字母夹住的部分。

前面的部分和上面相同,只是正则表达式变了。

<span style="font-size:14px;">res=re.findall(r"[^A-Z][A-Z]{3}([a-z])[A-Z]{3}[^A-Z]", str)
print ''.join(res)
</span>
这里表示以大写字母开头和结尾,且有且仅有3个大写字母。   第一次可能没有考虑全面(比如我!)会把A AAAsAAA A这种算进去。

第4关:

把linkedlist.php复制到地址栏跳转过去后,又要查看源代码。

可以看到,就是让你不断地跳转页面,可以设定一个正则判断,直到不出现next跳出。

<span style="font-size:14px;">import urllib
import re
urlbase = 'http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing='

num = '25357'

while(1):
	content = urllib.urlopen(urlbase+num).read()
	match = re.search('and the next nothing is (\d+)',content)
	if(match != None):
		num = match.group(1)
		print num
	else:
		break
</span>
中间会有几次停下来,可以进入到最后print的num网页里查看信息,按它要求操作,然后修改num继续运行。

第5关:

这一关挺奇怪的...

大概就是这个图片叫peakhell,读音类似于pickle,因此是用pickle模块来处理src中的banna.p文件

然后会得到一个列表,由多个装满了(word,count)键值对的小列表组成,

<span style="font-size:14px;">import cPickle as pickle
#我把它保存到123里了,其实可以直接用urllib打开的
object = pickle.load(open("123"))

for item in object:
    print "".join(map(lambda p: p[0]*p[1], item))
</span>

在Python中,无论是变量还是函数,都是一个对象。当Python运行时,对象存储在内存中,随时等待系统的调用。然而,内存里的数据会随着计算机关机和消失,pickle可以将对象保存到文件,并储存在硬盘上。

可以pickle所有Python支持的 原生类型 : 布尔, 整数, 浮点数, 复数, 字符串, bytes(字节串)对象, 字节数组, 以及 None.由任何原生类型组成的列表,元组,字典和集合。由任何原生类型组成的列表,元组,字典和集合组成的列表,元组,字典和集合(可以一直嵌套下去,直至Python支持的最大递归层数).函数,类,和类的实例(带警告)。例子:

<span style="font-size:14px;"># _*_ coding = utf-8 _*_
import pickle  
   
#序列化  
def dump_pickle():  
    user={}  
    user['id']=1 
    user['name']='tanweijie' 
    user['email']='tanweijie@outlook.com' 
    user['sex']='boy' 
   
    #with保证自动关闭文件  
    #设置文件模式为'wb'来以二进制写模式打开文件  
    with open('C:/Users/Mr_Tank_/Desktop/user.pickle','wb') as f:  
        #dump()函数接受一个可序列化的Python数据结构  
        pickle.dump(user,f)  
        print('success')  
   
#反序列化  
def load_pickle():  
    with open('C:/Users/Mr_Tank_/Desktop/user.pickle','rb') as f:  
        user=pickle.load(f)  
    #user变量是一个字典      
    print(user)  </span>

第6关:

这一关其实和第4关类似。打开源代码,它提示你下载channel.zip(hrml标签那里隐晦的提示)。下载下来你就懂了,就是不断的打开文件,跳转,代开文件...

但是这里有一点可能很多人不理解,最后一个文件写着“collect  the  comment”,让人摸不到头脑。但其实,每一个压缩文件都有一个文件信息叫做注释,linux下的归档管理器是看不到的,windows下的强大的压缩工具可以看到..

python challenge 答案详解~(1)_第1张图片

好在python有封装好的函数可以读取他们~

import zipfile,re

z=zipfile.ZipFile('channel.zip','r')

value=90052

findNothing = re.compile(r'(?<=Next nothing is )\d+').search

comments=[]

while True:
    content=z.read('%s.txt'%value)
    comments.append(z.getinfo('%s.txt'%value).comment)
    match=findNothing(content)
#    match=apply(findNothing,(content,))
    if match:
        value=match.group(0)
    else:
        break
    print content

print z.read('%s.txt'%value)

print ''.join(comments)


现就这样0.0

你可能感兴趣的:(python challenge 答案详解~(1))