网络上的第一个 Python 编程难题挑战 (完)
建立日期: 2020/03/28
更新日期: 2020/04/22 第33关 (完)
个人常用集 Tool.py
网址: http://www.pythonchallenge.com/
说明:本文请随意引用或更改,只须标示出处及作者,作者不保证内容絶对正确无误,如造成任何后果,请自行负责.
标题:网络上的第一个Python编程难题挑战
找到一网站, 专门来挑战你对Python的了解程度以及个人智商, 以下是个人对每个问题详解, 不会一次解完所有的问题, 阶段性的补上内容.
(问题内容以英文为主)
第0关 http://www.pythonchallenge.com/pc/def/0.ht...
Hint: try to change the URL address.
提示: 试着改变URL地址
[解]
- 因为这是第0关, 要找到第1关, 所以把网址中的0改成1
http://www.pythonchallenge.com/pc/def/1.ht...
2**38 is much much larger.
2**38 是非常非常的大. - 意思是让我们算一下2**38有多大
>>> print(2**38) 274877906944
- 把这个数代入网址, 结果进入第1关了
http://www.pythonchallenge.com/pc/def/2748...
而且, 网址后面被改为map, 表示这个map可能有坑.
第1关 http://www.pythonchallenge.com/pc/def/map....
everybody thinks twice before solving this.
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.
[解] 图下面有一段看起来像乱码的内容, 而图中把K, O, E转换为M, Q, G, 是一个转码题
- 直觉的想法, 当然就是把那一段像乱码的内容中, 把K, O, E转换为M, Q, G, 结果还是乱码
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 rcv"
"r gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnj"
"w ml rfc spj.")
text = text.replace('k', 'm').replace('o', 'q').replace('e', 'g')
print(text)
"""
g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr ammnsrcpq ypcdmp. bmglg gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmlg. sqglg qrpglg.myicrpylq() gq pcammmclbcb. lmu ynnjw ml rfc spj.
"""
- 观察一下, 每个转换都是字母向后移2位, 假设到了Y, Z就移A, B, 这里都是小写, 就不管大写了.
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 rcv"
"r gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnj"
"w ml rfc spj.")
# 使用字串的maketrans以及translate来作转换
table1 = ''.join([chr(ord('a')+i) for i in range(26)]) # abcd...xyz
table2 = table1[2:]+table1[:2] # cdef...zab
trans = table1.maketrans(table1, table2)
result = text.translate(trans)
print(result)
"""
i hope you didnt translate it by hand. thats what computers arefor. 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.
"""
- 嗯, 看到正常的英文句子了, 但是怎么套上网址 ? 改为maketrans ?
http://www.pythonchallenge.com/pc/def/make...
that's a handy little function. isn't it?
还是不对, 没进入第2关… - 对了, 把网址上的map可能有坑, 试转换一下
text = "map"
...
"""
ocr
"""
- 改网址为 ocr, 果然进入第2关了
第2关 http://www.pythonchallenge.com/pc/def/ocr....
recognize the characters. maybe they are in the book,
but MAYBE they are in the page source.
[解] 书中的字, 太过模糊, 不太可能看清楚, 所以答案应该在page source, 意思就是在源代码中, 按右键检视网页原始源代码.
- 看了下源代码
里面有一个特殊的地方, 让我们在那一长串的字符中找出少出现的字.
<!--
find rare characters in the mess below:
-->
<!--
%%$@_$^__#)^)&!_+]!*@&^}@[@%]()%+$&[(_@%+%$*^@$^!+] !&_#)_*}{}}!}_]$[%}@[{_@#_^{*
@##&{#&{&)*%(]{{([*}@[@&]+!!*{)!}{%+{))])[!^})+)$] #{*+^((@^@}$[**$&^{$!@#$%)!@(&
...
}!)$]&($)@](+(#{$)_%^%_^^#][{*[)%}+[##(##^{$}^]#&( &*{)%)&][&{]&#]}[[^^&[!#}${@_( |
#@}&$[[%]_&$+)$!%{(}$^$}* |
-->
- 为了不复制一大段的字符, 打开网页撷取, 这就开始爬虫了…因为简单就不用bs4或其它的包来解析html了, 建立字典记录所有字出现的次数. (这里有个缺点, 就是字典不会按顺序列出其中的元素, 刚好我的结果就是对的, 所以就不再试其他方法了)
from urllib import request
url = "http://www.pythonchallenge.com/pc/def/ocr.html"
with request.urlopen(url) as response:
data = response.read()
html = data.decode('utf-8')
start_string = "<!--\n"
length = len(start_string)
stop_string = "-->\n"
# 有两个comment, 要找后面那一个, 所以使用rfind, 不用find.
start = html.rfind(start_string)
stop = html.rfind(stop_string)
text = html[start+length:stop].replace('\n', '')
chars = {}
for char in text:
chars[char] = chars[char] + 1 if char in chars else 1
avg = sum(chars.values())/len(chars)
result = ''.join([char for char in chars if chars[char]<avg])
print(result)
"""
equality
"""
- 更改网址为equality, 嗯果然看到第3关了.
- 这里也可以使用正则式, 不过这个是已知结果都是各一次出现的a-z
import re
print(''.join(re.findall('[a-z]', text)))
"""
equality
"""
<下回继续>
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: