第0关
计算2的38次方
私信小编01即可获取Python学习资料
>>> 2**38
274877906944
>>> pow(2,38)
274877906944
第1关
实现字母移位编解码
import string, sys
a = string.ascii_lowercase
b = a[2:] + a[:2]
s = sys.stdin.read()
print s.translate(string.maketrans(a, b))
第2关
从一大段字符串中寻找只出现过一次的字符,并按原顺序输出。
import urllib, re, sys
def get_file(fname):
url = 'http://www.pythonchallenge.com/pc/def/' + fname
return urllib.urlopen(url).read()
dat = get_file('ocr.html')
txt = re.findall(r'<!--(.*?)-->', dat, re.S)[-1]
d = {}
for i in txt:
d[i] = d.get(i, 0) + 1
for i in txt:
if d[i] == 1:
sys.stdout.write(i)
第3关
从一大段字符中找出小写字母,要求它的左右分别恰好有三个大写字母,按原顺序输出。
import urllib, re, sys
def get_file(fname):
url = 'http://www.pythonchallenge.com/pc/def/' + fname
return urllib.urlopen(url).read()
dat = get_file('equality.html')
txt = re.findall(r'<!--(.*?)-->', dat, re.S)[-1]
ans = re.findall(r'[^A-Z][A-Z]{3}([a-z])[A-Z]{3}[^A-Z]', txt, re.S)
print ''.join(ans)
第4关
有一组类似链表结构的网页,每个页面给出了下一个页面的地址参数,遍历整个链找到最后的结点。
import urllib, re
def get_file(fname):
url = 'http://www.pythonchallenge.com/pc/def/' + fname
return urllib.urlopen(url).read()
pre = 'linkedlist.php?nothing='
idx = '12345'
while True:
dat = get_file(pre + idx)
print dat
ans = re.search(r'd+', dat)
if ans is None: break
idx = ans.group(0)
第5关
使用pickle模块加载序列化后的内容,然后打印出来。
import urllib, pickle
def get_file(fname):
url = 'http://www.pythonchallenge.com/pc/def/' + fname
return urllib.urlopen(url).read()
dat = get_file('banner.p')
ans = pickle.loads(dat)
print '
'.join([''.join([j[0] * j[1] for j in i]) for i in ans])
第6关
与第4关类似,但这次结点信息存在于一个zip文件中,需要从头到尾拼接各个文件的注释内容。
import urllib, StringIO, zipfile, re
def get_zip(fname):
url = 'http://www.pythonchallenge.com/pc/def/' + fname
return zipfile.ZipFile(StringIO.StringIO(urllib.urlopen(url).read()))
z = get_zip('channel.zip')
idx = 'readme'
cmt = ''
while True:
cmt += z.getinfo(idx + '.txt').comment
txt = z.read(idx + '.txt')
ret = re.search(r'd{2,}', txt)
if ret is None: break
idx = ret.group(0)
print cmt
第7关
在一张图片的中间取一部分像素点,将其灰度值转换成对应的Ascii字符。
>>> import urllib, StringIO
>>> from PIL import Image
>>> src = urllib.urlopen('http://www.pythonchallenge.com/pc/def/oxygen.png').read()
>>> img = Image.open(StringIO.StringIO(src))
>>> w, h = img.size
>>> ''.join([chr(img.getpixel((i, h/2))[0]) for i in xrange(0, w, 7)])
'smart guy, you made it. the next level is [105, 110, 116, 101, 103, 114, 105, 116, 121]pe_'
>>> ''.join(map(chr, [105, 110, 116, 101, 103, 114, 105, 116, 121]))
'integrity'
第8关
给出经bzip压缩过的用户名和密码内容,将其还原。
>>> import bz2
>>> uid='BZh91AY&SYAxafx82
x00x00x01x01x80x02xc0x02x00 x00!x9ah3Mx07<]xc9x14xe1BAx06xbex084'
>>> pwd='BZh91AY&SYx94$|x0ex00x00x00x81x00x03$ x00!x9ah3Mx13<]xc9x14xe1BBPx91xf08'
>>> bz2.BZ2Decompressor().decompress(uid)
'huge'
>>> bz2.BZ2Decompressor().decompress(pwd)
'file'
第9关
给出一个整数列表代表一条线,其中第i点的x,y坐标下标分别为2i, 2i+1,根据坐标点画出该图。
>>> from PIL import Image, ImageDraw
>>> l1 = [146,399, ...]
>>> l2 = [156,141, ...]
>>> img = Image.new('1', (500,500), 1)
>>> draw = ImageDraw.Draw(img)
>>> draw.line(zip(l1[0::2], l1[1::2]))
>>> draw.line(zip(l2[0::2], l2[1::2]))
>>> img.save('out.png')
第10关
求look-and-say sequence中第31项的长度。
a = ['1']
for i in xrange(30):
t = ''
n = 0
x = ''
for i in a[-1]:
if n == 0:
n = 1
x = i
elif i == x:
n += 1
else:
t += str(n) + x
n = 1
x = i
else:
t += str(n) + x
a.append(t)
print len(a[30])
第11关
给出一张图像,要求去掉x,y坐标和为奇数的像素点。
import urllib
import StringIO
from PIL import Image, ImageDraw
url = 'http://www.pythonchallenge.com/pc/return/cave.jpg'
dat = urllib.urlopen(url).read()
img = Image.open(StringIO.StringIO(dat))
w, h = img.size
for i in xrange(w):
for j in xrange(h):
if (i + j) % 2:
img.putpixel((i,j), 0)
img.save('out.png')