PythonChallenge学习笔记3,4,5

上文介绍了PythonChallenge的前三题,这几天我又抽空把接下来的3题也看了一下,以下是学习的总结。

第三题

http://www.pythonchallenge.com/pc/def/equality.html

One small letter, surrounded by EXACTLY three big bodyguards on each of its sides.

一开始对这句描述理解错了,我以为是一个小写字母相邻的四个字母中有三个是大写字母。所以写下了下面的代码。但是得到的答案并不是英文单词,尝试访问了一下也是页面无法显示,看来我找到的答案不对。

file = open('D://Program Files//Python//tmp.txt')
tmp = file.readline()
strlst = list()
while tmp:
    strlst.append(tmp)
    tmp = file.readline()
file.close()

i = 0
j = 0

leni = len(strlst)
print leni
while i < leni:
    lenj = len(strlst[i])
    while j < lenj:
        if strlst[i][j].islower() and (i == 0 or i == leni-1 or j == 0 or j == lenj-1):

            cnt = 0

            if i-1 >= 0 and strlst[i-1][j].isupper():
                cnt += 1
            if j-1 >= 0 and strlst[i][j-1].isupper():
                cnt += 1
            if i+1 < leni and strlst[i+1][j].isupper():
                cnt += 1
            if j+1 < lenj and strlst[i][j+1].isupper():
                cnt += 1

            if cnt == 3:
                print strlst[i][j]
                print str(i) + ' ' + str(j)
        j += 1
    i += 1

看了网上的教程,才明白实际上题目的意思是,找到左右两边刚好各有三个大写字母的小写字母,例如aABCdEFGf,那么d就是我们要找的,英语差真是伤不起啊。这样就可以用正则表达式来做了,刚好我不太熟悉正则,可以学习一下。

import re,urllib
f=urllib.urlopen('http://www.pythonchallenge.com/pc/def/equality.html')  
str= f.read()  
ans=re.findall(r"((?<=[^A-Z][A-Z]{3})[a-z](?=[A-Z]{3}[^A-Z]))", str)
print ''.join(ans)

第四题

www.pythonchallenge.com/pc/def/linkedlist.php

题目的意思其实不难理解,通过点击图片,或者看源码发现linkedlist.php?nothing=12345这段代码,通过访问该链接,我们能找到下一个访问的id,也就是一个数字编号,可以通过这个编号继续访问下个页面,而且最多不会超过400次,利用简单的正则表达即可。实际上循环了200多次就找到答案了。这道题也算是比较有意思的一题。

import re,urllib
urltmp = "http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing="
i = 1
ans = "123456"
while ans:
    url = urltmp + ''.join(ans)
    f = urllib.urlopen(url)
    str= f.read()
    ans = re.findall(r"((?<=nothing is )[0-9]*)", str)
    i += 1
    #print ans
print i
print url

第五题

http://www.pythonchallenge.com/pc/def/peak.html

提示是peak hell sounds familiar ?

一些高手或者英文达人当然知道是pickle,序列化的意思,但我是实在没想出来。虽然看到了banner.p这个文件,不过下载下来发现是乱码。所以我也是网上找答案并学习了一下map的用法。

map(function, sequence[, sequence, ...]) -> list

其实map返回的也就是一个list,不过其每个元素都是从另一个list的元素转化过来,转化的规则就是一个func方法,作为参数传入。当然seq可以是多个,不过会按照元素顺序同时处理,也就是长度不一致的时候,只会处理到短的list结束为止。

通过序列化出来,我们看到结果object是一个list,而且元素是包含两个子元素的list,一个是字符,一个是数字。我们可以联想到把字符重复n次,n就是对应的数字。最后解析完之后得到一幅字符画。

import pickle

object = pickle.load(urllib.urlopen('http://www.pythonchallenge.com/pc/def/banner.p'))

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