[Python Challenge通关]第5关 peak hell

第 5 关

挑战地址,点我JFM5Ky.png

问题

Jx0Uks.jpg
pronounce it

分析

页面干干净净,没有任何信息,我们右键查看网页源代码看一下。

<peakhell src="banner.p"/>
</body>
</html>

<!-- peak hell sounds familiar ? -->

这里有一段提示 peak hell sounds familiar ? peak hell 和什么的发音相似?
我们还看到有个 peakhell 标签,里面有个 banner.p,我们打开看下是一堆不规则的文本。

其实 python 中有个 pickle 模块,用来进行对象的序列化和反序列化。

我们尝试把 banner.p 中的内容反序列化试下:

import urllib.request
import pickle

url = "http://www.pythonchallenge.com/pc/def/banner.p"

with urllib.request.urlopen(url) as f:
    print(pickle.load(f))

输出内容:

[[(' ', 95)], [(' ', 14), ('#', 5), (' ', 70), ('#', 5), (' ', 1)], ...省略

可以发现反序列化后,这是一个二维数组,我们把输出的格式调整一下:

import urllib.request
import pickle

url = "http://www.pythonchallenge.com/pc/def/banner.p"

with urllib.request.urlopen(url) as f:
    result = pickle.load(f)
    for r in result:
        print(r)

输出内容:

[(' ', 95)]
[(' ', 14), ('#', 5), (' ', 70), ('#', 5), (' ', 1)]
[(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)]
...省略

感觉毫无头绪… 仔细找下规律,发现每一行的数字之和都是 95,而且里面每一个元组由两部分组成,一个字符(空格或者#),一个数字,比如:(’ ‘, 14), (’#’, 5)。可以联想一下,这是一个矩阵,元组中的数字代表前面的字符重复次数,每一行都有95个字符。我们按照这个猜想试一下,看看会有什么效果。

import urllib.request
import pickle

url = "http://www.pythonchallenge.com/pc/def/banner.p"

with urllib.request.urlopen(url) as f:
    result = pickle.load(f)
    for r in result:
        for c in r:
            for i in range(c[1]):
                print(c[0], end="")
        print()

输出内容:

              #####                                                                      #####
               ####                                                                       ####
               ####                                                                       ####
               ####                                                                       ####
               ####                                                                       ####
               ####                                                                       ####
               ####                                                                       ####
               ####                                                                       ####
      ###      ####   ###         ###       #####   ###    #####   ###          ###       ####
   ###   ##    #### #######     ##  ###      #### #######   #### #######     ###  ###     ####
  ###     ###  #####    ####   ###   ####    #####    ####  #####    ####   ###     ###   ####
 ###           ####     ####   ###    ###    ####     ####  ####     ####  ###      ####  ####
 ###           ####     ####          ###    ####     ####  ####     ####  ###       ###  ####
####           ####     ####     ##   ###    ####     ####  ####     #### ####       ###  ####
####           ####     ####   ##########    ####     ####  ####     #### ##############  ####
####           ####     ####  ###    ####    ####     ####  ####     #### ####            ####
####           ####     #### ####     ###    ####     ####  ####     #### ####            ####
 ###           ####     #### ####     ###    ####     ####  ####     ####  ###            ####
  ###      ##  ####     ####  ###    ####    ####     ####  ####     ####   ###      ##   ####
   ###    ##   ####     ####   ###########   ####     ####  ####     ####    ###    ##    ####
      ###     ######    #####    ##    #### ######    ###########    #####      ###      ######

这些空格和#最终组成了一个单词 channel,这应该就是下一关的入口了http://www.pythonchallenge.com/pc/def/channel.html

参考资源:

  1. 官方文档pickle模块
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值