这是一个学习 Python 的趣味网站,通过关卡的形式来锻炼 Python 水平。一共有 33 关,每一关都需要利用 Python 知识解题找到答案,然后进入下一关。很考验对 Python 的综合掌握能力,比如有的闯关需要用到正则表达式,有的要用到爬虫
一般情况下,我们学习 Python 都是按照章节顺序,比如从基本语法、基本数据类型、条件语句、循环语句、函数,面向对象等等来进行的,如果学习时间跨度过大,那么就很容易忘记前面的所学。此时正好可以拿这个网站来综合测试一下对 Python 的掌握情况,以便查缺补漏
下面我们来就来说一下这个网站怎么玩
可以看到进入网站主页面,映入眼帘的就是一个很有年代感的画面,看来是一个年代比较久远的网站了,但是可千万不要因为网站建立的时间长就小瞧它哦!
接下来我们点击get challenged
开始挑战
第0关,古香古色,哈哈哈,是让我们根据2的38次方来更改 url,这应该就算是热身运动吧,我们直接通过 Python 计算一下即可
把计算的结果替换 url 中的0就可以进入到下一关了
接下来就是正式的关卡了,我们的游戏也正式开始!
根据图片中的字母以及下方的提示,我们可以得出:前面的字母往后移动两位就是后面的字母
然后根据这个规律,重新计算最下方的一串字符
这里考察了 Python 当中字符串编码的相关知识
text = '''g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.''' def trans(text): new_text = '' for i in text: if str.isalpha(i): n = ord(i) if i >= 'y': n = ord(i) + 2 - 26 else: n = ord(i) + 2 new_text += chr(n) else: new_text += i print(new_text) trans(text)
Output:
i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and that's why this text is so long. using string.maketrans() is recommended. now apply on the url.
可以看到网站的作者还是蛮幽默的,哈哈哈,不要手动翻译~
接下来我们再次调用函数,传入“map”就可以拿到新的 url 了
trans("map")
Output:
ocr
此时我们把 url 中的 map 替换为 ocr 就可以进入下一关
提示说可能在书里,哈哈哈,这是要看瞎的节奏,也可能在网页源代码里。我们通过右键查看源代码往下拉看到绿色区域
看到一行提示:find rare characters in the mess below
意思就是要在下面这一大串字符里找到出现次数最少的几个字符
我们先使用 request 请求网页,然后通过正则表达式来获取字符
import requests def get_challenge(s): return requests.get('http://www.pythonchallenge.com/pc/' + s).text text = get_challenge('def/ocr.html') str = ''.join(text) import re text = re.compile('<!--((?:[^-]+|-[^-]|--[^>])*)-->', re.S).findall(str)[-1] counts = {} for c in text: counts[c] = counts.get(c, 0) + 1 print(counts)
Output:
{'\n': 1221, '%': 6104, '$': 6046, '@': 6157, '_': 6112, '^': 6030, '#': 6115, ')': 6186, '&': 6043, '!': 6079, '+': 6066, ']': 6152, '*': 6034, '}': 6105, '[': 6108, '(': 6154, '{': 6046, 'e': 1, 'q': 1, 'u': 1, 'a': 1, 'l': 1, 'i': 1, 't': 1, 'y': 1}
可以看到出现次数最少的就是最后几个字符,合起来是「equality」,替换 url 字符 ocr 就可以进入下一关了
好了,是不是挺有意思的,我们就不再继续剧透了,感兴趣的小伙伴可以自行探索,对于巩固 Python 基础知识还是非常有帮助的!
网站地址:http://www.pythonchallenge.com/
官方参考:https://garethrees.org/2007/05/07/python-challenge/
好了,这就是今天分享的全部内容,喜欢就点个赞+在看吧~