最近在网上看到一个非常有意思的 Python 游戏通关网站,一共有 33 关,每一关都需要利用 Python 知识解题找到答案,然后进入下一关。 很考验对 Python 的综合掌握能力,比如有的闯关需要用到正则表达式,有的要用到爬虫。 我们平常学 Python 都是按章节顺序、包或者模块来学,容易前学后忘。正好可以拿这个网站来综合测试一下对 Python 的掌握情况,以便查缺补漏。 来说说这个网站怎么玩。 mark 这是网站主页面,很有历史感对吧,诞生了已有十几年了。但千万不要因为看着像老古董而小瞧它。 mark 我们来玩玩看,点击「get challenged」开始挑战。 第 0 关是 Warming up 热身环节: 这一关要求是修改 URL 链接,给的提示是电脑上的数学表达式:2 的 38 次方,所以大概就是需要计算出数值,然后修改url 进入下一关。 所以这关就是考 Python 的基本数值运算,你知道怎么算么? 打开 Python 自带终端,一行代码就能计算出结果: mark 把原链接中的 mark 游戏这就正式开始了。图片中的笔记本给了三组字母,很容易发现规律:前面的字母往后移动两位就是后面的字母。 那么需要做的就是根据这个规律把下面的提示字符串,做位移解密得到真正的句子含义: 这道题考察字符串编码和 for 循环相关知识,代码实现如下: 1text = '''g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq 2 ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q 3 ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq 4 gq pcamkkclbcb. lmu ynnjw ml rfc spj.''' 5 6text_translate = '' 7for i in text: 8 if str.isalpha(i): 9 n = ord(i) 10 if i >= 'y': 11 n = ord(i) 2 - 26 12 else: 13 n = ord(i) 2 14 text_translate = chr(n) 15 else: 16 text_translate = i 17print(text_translate) 得到结果:
作者很风趣,当然不能手动去一个推算了,推荐用 string.maketrans 这个方法解决,我们上面采取的是比较直接的方法,官方给出了更为精简的方法: 1import string 2l = string.lowercase 3t = string.maketrans(l, l[2:] l[:2]) 4print (text.translate(t)) 然后把 url 中的 map 改为ocr回车就来到了第 2 关: mark 作者接着说过关的提示可能在书里(当然不可能了)也可能在网页源代码里。那就右键查看源代码往下拉看到绿色区域,果然找到了问题: mark 意思就是:要在下面这一大串字符里找到出现次数最少的几个字符 考察了这么几个知识点:
如果是你,你会怎么做? 来看下,十行代码快速实现:
首先,用 Requests 请求网页然后用正则提取出字符串,接着 for 循环计算每个字符出现的次数。 1% 6104 2$ 6046 3@ 6157 4_ 6112 5^ 6030 6# 6115 7) 6186 8& 6043 9! 6079 10 6066 11] 6152 12* 6034 13} 6105 14[ 6108 15( 6154 16{ 6046 17 18e 1 19q 1 20u 1 21a 1 22l 1 23i 1 24t 1 25y 1 可以看到出现次数最少的就是最后几个字符,合起来是「equality」,替换 url 字符就闯过过了第 2 关进入下一关继续挑战。是不是有点意思? 后面每一关都需要用到相关的 Python 技巧解决,比如第 4 关: mark 这一关作者弄了个小恶作剧,需要手动输入数值到 url 中然后回车,你以为这样就完了么?并没有它有会不断重复弹出新的数值让你输入,貌似无穷尽。 所以,这一关肯定不能采取手动输入的方法闯关,自然要用到 Python 了。要实现自动填充修改 url 回车跳转到新 url,循环直到网页再也无法跳转为止这一功能。 如果是你,你会怎么做? 其实,一段简单的爬虫加正则就能搞定。思路很简单,把每次网页中的数值提取出来替换成新的 url 再请求网页,循环下去,代码实现如下:
输出结果如下: 可以看到,最终循环了 85 次找到了最后一个数字16044,输入到 url 中就闯关成功。 |
|