网络上的第一个 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 协议》,转载必须注明作者和本文链接
真有趣
第3关 http://www.pythonchallenge.com/pc/def/equa...
One small letter, surrounded by EXACTLY three big bodyguards on each of its sides.
[解] 一个’小’字母, “刚好”被前后各三个”大”保镳围着
第4关 http://www.pythonchallenge.com/pc/def/link...
[解] 咦, 没有文字提示?
可以点图进入, 网变成
http://www.pythonchallenge.com/pc/def/link...
文字提示 and the next nothing is 44827, 再改网址为44827,
文字提示 and the next nothing is 45439, 再改网址为45439,
..... 天啊要多少次 ?
还是看网页源代码, 看到一行注解 , 让我们使用urllib, 它说了也许改了400次就可以了, 也许 ??
urllib may help. DON'T TRY ALL NOTHINGS, since it will never end. 400 times is more than enough.
还是用urllib来代理吧
第5关 http://www.pythonchallenge.com/pc/def/peak...
pronounce it
[解] 发音 ?? 念看看 ?? 还是看网页源代码
有一行注解 peak hell sounds familiar ? peak hall 听起来熟悉吗?
pickall ? pikcle ? pickle, 嗯python中有一个模组就叫pickle, 可以用来转换资料结构为字节流, 比如字典转换成bytes. 但哪来的资料结构 ?
再检查一下网页源代码, 除了格式格style.css, 还有显示的图片peakhell.jpg, 咦, 还有一个 banner.p 档没用到, 下载存档再说.
用pickle.load载入banner.p
费脑子。。不过挺有意思的。。发出来。有空可以玩玩。。
第6关 http://www.pythonchallenge.com/pc/def/chan...
[解] 唯一可动的就是捐款按键, 进去就是捐款, 没助解题, 还是网页源代码
Comments ? 注解在哪 ? 这可能与压缩档 zip有关, Python zip ? Python zipfile ?
https://docs.python.org/3.3/library/functi... 不是这个
https://docs.python.org/3/library/zipfile.... 就是这个
看到hockey, 改了网址, 这里都是用小写的网址, 结果
it's in the air. look at the letters. 在空中, 看下字母....按每个字的字母应该是oxygen
更改网址为oxygen.html, 哈, 看到第7关了.
第7关 http://www.pythonchallenge.com/pc/def/oxyg...
[解] 没有提示, 直觉图片中隐藏有密码, 要把图片中那一片异常的点值找出来, 图片先存档
@Jason990420 这个网址有答案的吗
只有33关, 网址本身没有答案吧, 但有很多人提出自己的答案, 网上能搜到的, 直接看答案就没意思了
第8关 http://www.pythonchallenge.com/pc/def/inte...
Where is the missing link?
[解] 遗失的链结在哪? 图中的蜜蜂可以点击, 然后要输入用户名以及密码, 老样子还是看网页源代码, 最后面的注解中的un/pw应该就是用户名以及密码, 看来要解码.
看起来没那么简单? 肯定又是某种编码转换. 在登入时应该有一个提示The site says: "inflate", 我就是看不到. 找下Python 的inflate, "inflate is a Python built command line interface", 这也不对. 要辨识其压缩的方法, 最重要的是前两码的header, 这里是'BZ', 在谷歌上搜索python deflat header 'BZ' , 找到了
https://docs.python.org/3/library/bz2.html
编码之间的转换, 在Python 2与Python 3还是不一样的.
第9关 www.pythonchallenge.com/pc/return/g...
[解] 没提示, 直接看网页源代码, 注解 first+second=? 长度不一样不能相加
第10关 www.pythonchallenge.com/pc/return/b...
len(a[30]) = ?
[解] 又是牛, len(a[30]) 得看a[30]是什么东西, 图中站着的牛是可以点击的, 然后出现了下面的内容, 有头没尾的, 还是看一下网页源代码. 标题是what are you looking at ? 意思是那头牛问你说你在看什么? 看了一下, 没有别的提示了.
第11关 http://www.pythonchallenge.com/pc/return/5...
[解] 直接看网页源代码, title - odd even 就这地方不太一样, 奇偶能出什么牌? 看了好久, 得的这图片好像有网格, 放大看一下. 试着处理一下这些网格
第12关 http://www.pythonchallenge.com/pc/return/e...
[解] 标题是 dealing evil, 处理恶魔...看了网页源代码, 没什么提示, 就是标题和上一面这张图.
.GFX File Format Description 不是这个3D模型描述档, 这是文本内容的
8 . 自己试着解码吧, 把evil2.gfx数据画成一张2D图, 看到结果似乎是五个点为单位.
ity, 进到第13关, 越来越难.第13关 http://www.pythonchallenge.com/pc/return/d...
phone that evil
[解] 线索
第14關 http://www.pythonchallenge.com/pc/return/i...
[解] 還有一張圖wire.png, 不管怎麼樣打開來都是一條長線, 而不是像網頁源代碼中所示, 再存檔右鍵看一下內容, 是一個寛度10000, 高度1的PNG檔.網頁標題walk around, 還有一個數學式子.
第15关 http://www.pythonchallenge.com/pc/return/u...
[解] 谁? 他不是最小的,他是第二? 为明天买花? 一月1?6 上面有个大黑点? 上面一月26日打了个圏? 和上关中出现的小黑有关? 一时想不到什么... 最右下角应该是二月, 二月有29天, 而且那一天是星期日, 先找一下那是哪一年?
再上网查一下, 那几年的01/26是哪个名人的生日 ?
http://www.birthdaytalker.com/content/2496
结果没有, 不会吧... 第二天该不会是01/27, 而不是01/26, 再查一下,嗯有两人, 1756年的莫扎特和1976年的林心如, 一定不会是后者, 那就是Wolfgang Amadeus Mozart, 每个字都试一下.
答案就是小写的 mozart, 这么简单就进到第16关了.
莫札特家中共七位兄弟姐妹, 他排老二, 也只有他姐姐和他活了下来, 其他的早逝, 所以说他不是最小的,他是第二 !
第16关 http://www.pythonchallenge.com/pc/return/m...
[解] 洋红纹都是一样的, 一样的东西就代表没有资讯.
第17关 http://www.pythonchallenge.com/pc/return/r...
[提示]
[解] 这个折线看了半天, 也不知道如何精确的取出, 也许有什么意义, 先不管. 不对, 这张见过, 在第4关, 回去比对了一下, 这图原来就长这样.那这小图有何用意呢? 再看别的线索吧.
吃? 饼干? 肯定不是, 这对解题一点帮助都没有, 但肯定是有种意义.
第18关 http://www.pythonchallenge.com/pc/return/b...
[提示]
[解] 一亮一暗两张图, 应该是亮度不一样, 亮度的变化都一样吗? 如果一样就代表没有资讯, 这和气球有啥关系?
http://www.pythonchallenge.com/pc/return/b...
第19关 http://www.pythonchallenge.com/pc/hex/bin....
[提示]
[解] 先提出那一大串的字符串吧
第20关 http://www.pythonchallenge.com/pc/hex/idio...
[提示]
[解] 先试看看几个关键字, private, property, beyond, fence, inspect, allow, away, unreal
第21关 (没有网址, 没有图片)
[提示]
[解] 只有一个非文字的档案 package.pack
第22关 http://www.pythonchallenge.com/pc/hex/copp...
[提示]
[解] white.gif ?
133 = 19*7, 试着把X座标, Y座标, max(X座标, Y座标), min(X座标, Y座标) 的值转成字母, 排列成19*7 或7\ *19 矩阵, 看看有没有什么东西? 结果什么也看不出来...
原始图片是一个摇杆, 如果我们把那移动的的点当作摇杆在动, 那可能就是向上, 向下, 向左, 向右... 试试, 毕竟还有一个暗示是emulate . 画出了一张图, 可好像字的靠在一起来, 把移动的距离拉大一点, 结果还是一样.
第23关 http://www.pythonchallenge.com/pc/hex/bonu...
[提示]
[解] this is an undocumented module ? 也许不是如字面上的意思, 这是一个叫作 undocumented 的模组? google 一下, 就看到下面这一项.
第24关 http://www.pythonchallenge.com/pc/hex/ambi...
[提示]
[解] 破解迷宫? 破解成功又如何? 这迷宫的墙还有颜色变化... 不管先解迷宫再说, 好像也没看到的提示? 由上而下? 这可说不定, 也许是上,下, 左, 右 ?
第25关 http://www.pythonchallenge.com/pc/hex/lake...
[提示]
[解] 没有lake0.jpg 或lake2.jpg, 或者html, 都不是, 第一个想到的winsound, 可是这个只供window 使用, 应该不是. wave ? .wav ? 那总要有档啊, 输入网址试试.
第26关 http://www.pythonchallenge.com/pc/hex/dece...
[提示]
[解] 先上 irc.freenode.net 看看, 连不上网? 电邮? 检查 http header 也没什么...
Can you believe what one mistake can lead to? 一个错误? 有三种可能, 有一位元组多出来了, 有一位元组少了, 有一位元组错了? 难道要一个一个位元组修改?哎, 试试吧. 又搞了半天, 还是不行, 解压缩结果, 看到当然还是那个字speed.
回头再看看, Hurry up, I'm missing the boat 快点, 我快要错过船班了. 这句不是这么翻译的啊? 是少了boat, 试试speedboat, yes, 没错, 原来第一步后就可以找到答案了.
第27关 http://www.pythonchallenge.com/pc/hex/spee...
[提示]
[解] 链接点进去, 要新的用户名及密码. 表格? 网址改了table[0,s,1, 2]都没有, 上面还有一句did you say gif ?, 把网址改成zigzag.jpg , 出来一张乱图. 第14关是绕一圈成一张新图. 又说不是第14关的重复, 搞不好就是类似的.
第28关 http://www.pythonchallenge.com/pc/ring/bel...
[提示]
[解] 第一眼看到的就是图片上一堆的长条纹, 放大看了看, 好像只能计算每个长条纹的长度, 再记录其颜色. 另外Ring 也是个第三方库, “Ring从代码的角度显示了一种控制缓存的方法-与存储无关”. 先从长条纹开始吧.
29关 http://www.pythonchallenge.com/pc/ring/gui...
[提示]
[解] 好像什么都没有, 仔细看了图片, 眼镜, 放大镜, 啤酒瓶, 我直接就想到了...玻璃, glass.
第30关 http://www.pythonchallenge.com/pc/ring/yan...
[提示]
[解] 没看到什么特别, 就注解里提到csv
第31关 http://www.pythonchallenge.com/pc/ring/gra...
[提示]
[解] 看不到能作什么, 唯一就是一照片还有 Where am I?

第32关 http://www.pythonchallenge.com/pc/rock/are...
[提示]
[解] 上面的数字明显是那一列的分开红点数, 左边的数字是那一行的分开红点数, fill in the blank ? 真点选填满, 什么事也没发生..., 蚀刻素描是1960年那个时代最著名的玩具之一, 在全球销售了超过1亿个单位. 奇怪了我就没听说过.
warmup.txt 填入网址, 得到一9x9的格子, 还有每一行列的计数值, 看来是要求数织Nonogram 的解. 要按行列的计数值决定图中的格子位置. 搞了好久才搞定...计算时间0.33秒, 还挺快的. (创建评论失败:回复内容过长 ! 代码后放)
出现一个箭头, 试试网址, Which direction? 试了一下, 发现答案是up, 不是left, 应该是x, y 变数弄反了, 这是题目太难解了, 都晕了. 又出来了一串字You want to go up? Let's scale this up then. Now get serious and solve this. 又来一个up.txt, 32x32, 还好我不是人工解题. 可是问题又来了.... 我是预先建一个单行9格的各种组合表, 有512种组合, 这里变成是一行32格的组合表, 代表有$2^{32}$ 的组合, $log(2^{32}) = 9.632$, 也就是有将近10G 的组合, 完了....前面辛苦写出来的程序又不能用了.
第33关 http://www.pythonchallenge.com/pc/rock/bee...
[提示]
[解] 33瓶啤酒? beer1.jpg?