肥嘟嘟(Fatbobman)的学习笔记Rss Feed

上学的时候懒不愿意做笔记,但确实了解笔记的重要性。现在想做笔记了,但是还是懒,当然对于重要性的认识丝毫没有动摇。

2005/11/28

Python Challenge 答案 (1-5)

The Python Challenge
从没想过解题还能这么有趣。
刚打开pythonchallenge的站点时有点莫名其妙的感觉,并不清楚到底问题在哪里。后来发现其中的奥秘就是你要在他所给的线索中找到下一题的url,这样便可以进入下一关了。
python challenge中有几个地方是重要的线索来源:
1:title (其中通常含有解题的思路提示)
2:page source (页面源代码,中间通常有数据资源,或者指明数据资源的位置)

第0题:
出现一幅画面,上面写着2**38,教你如何进入下一关。
计算出2**38 =
将浏览器中的 http://www.pythonchallenge.com/pc/def/0.html 改成 http://www.pythonchallenge.com/pc/def/274877906944.html 即可

第1题:密码转换
图片中显示出字符转换的规律 new_c=chr(ord(old_c)+2) 超过自动回转
title中提示making trans
因此比较简单的方法是直接使用string.translate进行转换。
oldstr = ' ...' #屏幕上显示的加密数据
import string
old='abcdefghijklmnopqrstuvwxyz'
new='cdefghijklmnopqrstuvwxyzab'
print string.translate(oldstr,string.maketrans(old,new))

得到如下显示:
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 http://www.pythonchallenge.com/pc/def/map.html上面的 map 进行一次转换得到ocr.
下一题入口:
http://www.pythonchallenge.com/pc/def/ocr.html

ps:说实话如果不是做这题,我可能跟不不会想起用maketrans这类的函数。

第2题: 抽取字符
页面显示提示数据在page source中
查看页面源代码。可以看到一组混乱的数据,并得到如下提示:find rare characters in the mess below:
最初我解此题时是将数据中所有出现的字符都放入哈希并计算出现的次数,后来发现只有英文字母是之出现一次的,由于哈希没有顺序,猜结果耗费的不少时间,后来干脆只提取字符一下子就获得的最后的结果。

#chardict={}
#for c in ocrstr:
# if chardict.has_key(c) :
# chardict[c]+=1
# else:
# chardict[c]=0
#
#print chardict

print ''.join([c for c in ocrstr if c.isalpha()])

计算后得到答案:equality
下题入口:http://www.pythonchallenge.com/pc/def/equality.html

第3题: 提取字符
title中提示使用正则
页面显示 两侧被3个(且只为3个)大写字母包围的小写字母
page source中有待处理的数据

import re
result=re.findall(r'[a-z][A-Z]{3}([a-z])[A-Z]{3}[a-z]',sourcestr)
print ''.join(result)

得到答案 linkedlist。
进入http://www.pythonchallenge.com/pc/def/linkedlist.html后显示linkedlist.php
下题入口 http://www.pythonchallenge.com/pc/def/linkedlist.php

ps:不是python解题吗,怎么用php:)

第4题:变态的url刷新
从title和图片可以看出来这题就像打水井一样,需要一遍又一遍的机械进行才能获得答案。
page source显示 图片的href 后面有一个nothing=12345的调用
urllib may help. don't try ALL nothings, since it will never
end. ~300 times is enough.
调用linkedlist.php?nothing=12345得到了and the next nothing is 92512 从中得到规律,根据每次获得的nothing值来进行下次url访问。

import urllib2
import re
r=re.compile(r'(\d+)$')
nextnothing='12345'
i=0
while(1):
try:
f=urllib2.urlopen('http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=%s'% nextnothing)
result=f.read()
f.close()
print result
oldnextnothing=nextnothing
nextnothing=r.search(result).group()
i+=1
except:
nextnothing=oldnextnothing

需要提示的是,这题竟然在访问的过程中还有变化。在进行了漫长的调用后当nothing 为92118,会显示Yes. Divide by two and keep going。中断程序,将nothing设置为 46059 继续运行。获得最后结果 peak.html
下题入口:http://www.pythonchallenge.com/pc/def/peak.html

第5题:pickle应用
说实在的尽管页面提示我将 peak hell 读出声来,我还是没有意识到pickle这个词(英文都还给了党)。
source page中有如下显示
查看http://www.pythonchallenge.com/pc/def/banner.p,通过显示的数据才反应过来应该是pickle

import urllib2
import cPickle as pickle
f=urllib2.urlopen('http://www.pythonchallenge.com/pc/def/banner.p')
result=pickle.Unpickler(f).load()

result是一个多维列表。分析数据感觉应该是一个字符组成的图画描述。
line=''
for n in result:
for m in n:
line+= m[0]*m[1]
print line+'\n'
line=''

打印后可获得答案channel
下题入口:http://www.pythonchallenge.com/pc/def/channel.html



python challenge目前共有33题,通过做这些题不仅可以开阔思路,更可以强迫自己去使用可能很少会使用的一些python模块,让自己在实践中提高。

1 Comments:

At 1:01 下午, Blogger jaypei said...

channel是个图形啊,厉害

 

发表评论

<< Home