StevenPZChan
StevenPZChan
4 min read

Categories

Tags

继续挑战


第5题地址peak.html

  • peakhell.jpg
  • 网页标题是peak hell,题目是pronounce it

惯例查看源码view-source,发现有一行注释和一个奇怪的标签:

peak hell sounds familiar
<peakhell src=”banner.p”/>

标签显然不是html具有的标签。结合题目内容来看,应该是让我们将peak hell读出来,说是应该很熟悉😓

其实也没有那么玄,熟悉python的话就知道这是个常用的模块,再读不出来熟悉的味道,一打开banner.p看到内容格式也就知道了。对,就是序列化的pickle模块!
不多说,试下看是什么对象:

import pickle
import requests
response = requests.get('http://www.pythonchallenge.com/pc/def/banner.p').content
banner = pickle.loads(response)
print(type(banner))
print(banner[:5])
<class 'list'>
[[(' ', 95)], [(' ', 14), ('#', 5), (' ', 70), ('#', 5), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)]]

反序列化成功了,得到一个列表,我们需要分析一下内容的含义。
列表的每个元素还是一个列表,而每个元素列表中的每个元素都是一个有两个元素的元组,而第一个元素不是' '就是'#',第二个元素是一个整数。
再进一步分析可以看出,每个元素列表中的这些数加起来都是95
貌似有点头绪了,感觉就像我们刚开始学编程的时候打印字符金字塔那样:

for pat in banner:
    print(''.join([x[0] * x[1] for x in pat]))
              #####                                                                      ##### 
               ####                                                                       #### 
               ####                                                                       #### 
               ####                                                                       #### 
               ####                                                                       #### 
               ####                                                                       #### 
               ####                                                                       #### 
               ####                                                                       #### 
      ###      ####   ###         ###       #####   ###    #####   ###          ###       #### 
   ###   ##    #### #######     ##  ###      #### #######   #### #######     ###  ###     #### 
  ###     ###  #####    ####   ###   ####    #####    ####  #####    ####   ###     ###   #### 
 ###           ####     ####   ###    ###    ####     ####  ####     ####  ###      ####  #### 
 ###           ####     ####          ###    ####     ####  ####     ####  ###       ###  #### 
####           ####     ####     ##   ###    ####     ####  ####     #### ####       ###  #### 
####           ####     ####   ##########    ####     ####  ####     #### ##############  #### 
####           ####     ####  ###    ####    ####     ####  ####     #### ####            #### 
####           ####     #### ####     ###    ####     ####  ####     #### ####            #### 
 ###           ####     #### ####     ###    ####     ####  ####     ####  ###            #### 
  ###      ##  ####     ####  ###    ####    ####     ####  ####     ####   ###      ##   #### 
   ###    ##   ####     ####   ###########   ####     ####  ####     ####    ###    ##    #### 
      ###     ######    #####    ##    #### ######    ###########    #####      ###      ######

改下地址channel.html打开,果然是下一题!

总结:这题是python常用模块pickle的用法演练,熟悉的话很容易。

本题代码地址5_peak.ipynb