Python Challenge 第 5 关攻略:peak hell

1,422 阅读1分钟

Python Challenge5 关攻略:peak hell


题目地址 www.pythonchallenge.com/pc/def/peak…


题目内容 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 地址,进入下一关: www.pythonchallenge.com/pc/def/chan…