这篇文章本来是发表于我的另一个blog上的,但由于目前又无法通过正常的渠道访问到哪里,所以才被我搬回来,也算是缘分吧。

如果你正在玩或打算玩python challenge的话,我不太推荐你看这篇文章。这就有点像魔术揭秘一样,一旦捅破了就不太好玩了。你可以在 http://pythonchallenge.com/forums/  去获取提示而不是答案。

从没想过解题还能这么有趣。
刚打开pythonchallenge的站点时有点莫名其妙的感觉,并不清楚到底问题在哪里。后来发现其中的奥秘就是你要在他所给的线索中找到下一题的url,这样便可以进入下一关了。
python challenge中有几个地方是重要的线索来源:
1:title (其中通常含有解题的思路提示)
2:page source (页面源代码,中间通常有数据资源,或者指明数据资源的位置)
3:序号(注意观察文件名或其他可能出现规律变化的地方)
4:前面的解或信息可能对以后的问题有所提示
5:实在解不开时看看是不是自己找到的线索还不够充分,通常情况下答案与线索之间的联系是紧密的,但也不要被一些看似有道理的线索给误导。

第0题:

   出现一幅画面,上面写着2**38,教你如何进入下一关。
计算出2**38 =
将浏览器中的 http://www.pythonchallenge.com/pc/def/0.html
改成 http://www.pythonchallenge.com/pc/def/274877906944.html 即可
   指导关,告诉你如何进行这个游戏。整个python challenge的游戏就是通过线索找到进入下一题的url,仅此而已:)

第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(i<=310): #实际不需要运行这么多次,好像200多次
    try:
        f=urllib2.urlopen(\
‘http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=%s’ % nextnothing)
        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模块,让自己在实践中提高。


评论

该日志第一篇评论

发表评论

评论也有版权!