Python Challenge
第 5
关攻略:peak hell
题目地址
http://www.pythonchallenge.com/pc/def/peak.html
题目内容
pronounce it
题目解法
这一题角度刁钻,对非英语母语的人有一些难度。
- 网页标题是
peak hell
- 图片是一个山峰,即
peak
- 页面文字提示
pronounce it
,让我们要读出来
把 peak hell
连读,发现读音很像 Python
的一个内置模块 pickle
。
老样子,查看一下网页源代码,发现了注释:
<!-- peak hell sounds familiar ? -->
同样也是提示 pickle
这一模块的信息。
另外有趣的是有一个 HTML
网页中非常规的标签,即 <peakhell src="banner.p"/>
。
查看 banner.p
文件,发现是乱码,推断这应该是用 pickle
模块存储的文件。
下面下载该文件并加载打印出来。
from urllib.request import urlretrieve
import pickle
url = 'http://www.pythonchallenge.com/pc/def/banner.p'
urlretrieve(url, filename = 'level5.pkl')
with open('level5.pkl', 'rb') as fp:
result = pickle.load(fp)
print(result)
打印出来是一个列表嵌套着列表,最里层是元组。
第一个元素是这样的: [(' ', 95)]
第二个元素是这样的: [(' ', 14), ('#', 5), (' ', 70), ('#', 5), (' ', 1)]
第三个元素是这样的: [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)]
发现每个元素的数字加起来都等于 95
,联想这可能是一个矩阵,数字代表了前面单个字符的重复次数。
另外注意到 banner
本身就有横幅、图片的意思。
于是修改程序如下,循环打印出 banner.p
里面的内容:
from urllib.request import urlretrieve
import pickle
url = 'http://www.pythonchallenge.com/pc/def/banner.p'
urlretrieve(url, filename = 'level5.pkl')
with open('level5.pkl', 'rb') as fp:
result = pickle.load(fp)
for i in result:
for j in i:
print(j[0] * j[1], end = '')
print('\n')
得到一张字符画,写着 channel
:
修改 URL
地址,进入下一关:
http://www.pythonchallenge.com/pc/def/channel.html