上文介绍了Python Challenge第6至10关的通关攻略及代码,本文继续介绍第11至15关的通关攻略及代码。
第11关:odd even
url:http://www.pythonchallenge.com/pc/return/5808.html
11.1 攻略
本关关卡名为“odd even”,即奇数偶数,界面图片模糊有重影,因此尝试将该图片分离为奇数和偶数像素,分离后的图片中有一个单词“evil”,因此修改url为http://www.pythonchallenge.com/pc/return/evil.html进入下一关。
11.2 代码
from PIL import Image
img = Image.open('cave.jpg')
width, height = img.size
new_img = Image.new('RGB', (width // 2, height // 2))
for i in range(width):
for j in range(height):
pixel = img.getpixel((i, j))
new_img.putpixel((i // 2, j // 2), pixel)
new_img.show()
输出:
第12关:dealing evil
url:http://www.pythonchallenge.com/pc/return/evil.html
12.1 攻略
- 查看源代码发现本关界面上的图片为“evil1.jpg”,如下图所示:
- 猜测可能还有其他图片,尝试修改图片地址中的evil1为evil2、evil3、evil4、evil5……
-
evil2 url:http://www.pythonchallenge.com/pc/return/evil2.jpg,图片提示不是jpg是gfx,因此修改url为http://www.pythonchallenge.com/pc/return/evil2.gfx下载得到evil2.gfx文件。
-
evil3 url:http://www.pythonchallenge.com/pc/return/evil3.jpg,界面提示没有evil了,但还是不信邪继续尝试。
-
evil4 url:http://www.pythonchallenge.com/pc/return/evil4.jpg,界面中是一个显示不出的图片,可能隐藏有信息。尝试读取该图片并打印输出得到提示信息“Bert is evil! go back!”,“go back”说明需要返回处理之前的图片,但“Bert is evil”有什么作用呢?后面发现居然是下一关的伏笔。
-
evil5 url:http://www.pythonchallenge.com/pc/return/evil5.jpg,这回彻底返回404了,说明没有图片了。
- 由于关卡界面上的牌被分成5堆,尝试将evil2.gfx拆分成5部分,得到5张图片,分别为“dis”、“pro”、“port”、“ional”、“
ity”,因此答案为disproportional,修改url为http://www.pythonchallenge.com/pc/return/disproportional.html进入第13关。
12.2 代码
from PIL import Image
from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True #设置可以加载大图片
import io
import os
with open('evil2.gfx', 'rb') as f:
data = f.read()
for i in range(5):
img = Image.open(io.BytesIO(data[i::5]))
img = img.resize((200, 200)) #调整图片大小便于展示
img.show()
输出:
第13关:call him
url:http://www.pythonchallenge.com/pc/return/disproportional.html
13.1 攻略
- 界面中是一部电话按键,提示“phone that evil”,让给evil打电话,在按键5上发现隐藏链接,点击跳转至http://www.pythonchallenge.com/pc/phonebook.php,如下图所示,该界面显示为xml。
- 结合关卡名“call him”中“call”同样有“调用”的含义,尝试通过XML-RPC调用带参数方法,使用xmlrpc.client包查看远程服务器的方法发现其中果然有phone方法。上一关中埋下的伏笔evil是Bert,因此调用phone(‘Bert’),得到答案“555-ITALY”,修改url为http://www.pythonchallenge.com/pc/return/italy.html进入第14关。
13.2 代码
import xmlrpc.client
proxy = xmlrpc.client.ServerProxy("http://www.pythonchallenge.com/pc/phonebook.php")
print(proxy.system.listMethods())
print(proxy.phone('Bert'))
# Output:
# ['phone', 'system.listMethods', 'system.methodHelp', 'system.methodSignature', 'system.multicall', 'system.getCapabilities']
# 555-ITALY
第14关:walk around
url:http://www.pythonchallenge.com/pc/return/italy.html
14.1 攻略
- 界面中是一个面包卷和一个条纹图片,查看源代码发现提示信息“remember: 100*100 = (100+99+99+98) + (…”,如下图所示,该数组可补全为[(100, 99, 99, 98), (98, 97, 97, 96), … , (2, 1, 1, 0)]。
- 条纹图片wire.png的大小刚好为10000 : 1,说明需要处理这张图片。结合面包卷一圈一圈绕起来的方式,尝试将该图片按照上述数组卷成100 : 100的新图片。
- 图片卷完得到一张小猫的图片,修改url为http://www.pythonchallenge.com/pc/return/cat.html,界面提示猫的名字为uzi,再次修改url为http://www.pythonchallenge.com/pc/return/uzi.html进入第15关。
14.2 代码
from PIL import Image
img = Image.open('wire.png')
new_img = Image.new('RGB', (100, 100))
direction = [(1, 0), (0, 1), (-1, 0), (0, -1)] # 右,下,左,上
new_x, new_y = -1, 0
array = []
for i in range(100, 0, -2):
array.extend([i, i - 1, i - 1, i - 2])
x = 0
for i in range(len(array)):
for j in range(array[i]):
new_x = new_x + direction[i % 4][0]
new_y = new_y + direction[i % 4][1]
new_img.putpixel((new_x, new_y), img.getpixel((x, 0)))
x += 1
new_img.show()
输出:
第15关:whom?
url:http://www.pythonchallenge.com/pc/return/uzi.html
15.1 攻略
- 关卡名为“Whom?”,应该是要猜一个人名。界面中是一个日历,1xx6年的1月26日被圈出来了,并且这天是星期一。查看源代码发现有两个提示:
- he ain’t the youngest, he is the second 他不是最小的,是第二小的。
- todo: buy flowers for tomorrow 待办:明天要买花,这说明1xx6年1月27日是一个重要日期,可能是他的生日。
- 日历右下角的2月份小日历中有29号,说明1xx6年是闰年。那么根据日期相关提示,尝试枚举出符合要求的1xx6年1月27日的日期,得到1176-01-27、1356-01-27、1576-01-27、1756-01-27、1976-01-27五个日期,查找1月27日出生的名人,发现莫扎特1756-01-27出生,因此答案为mozart,修改url为http://www.pythonchallenge.com/pc/return/mozart.html进入第16关。
15.2 代码
import datetime
import calendar
for year in range(1006, 1997):
if year % 10 == 6 and calendar.isleap(year):
if datetime.date(year, 1, 27).weekday() == 1:
print(f"{year}-01-27")
# Output:
# 1176-01-27
# 1356-01-27
# 1576-01-27
# 1756-01-27
# 1976-01-27
以上就是Python Challenge第11-15关攻略啦,第16-19关攻略请见文章Python Challenge通关攻略及代码(第16至19关)~
完整代码及运行结果详见: