0%

Python Challenge (Level 31)

第31关

先查出这个石头是什么地方。攻略上给出的是用户名kohsamui,密码thailand,跳到下一个页面。
http://www.pythonchallenge.com/pc/rock/grandpa.html

图片是曼德布罗特集合,具体可以看这里,解释得挺清楚的。

过关的主要步骤是按照Page Source里面的参数,画出一张曼德布罗特集合的图。比较自己画出的图和网页上的那张图的不同之处。将会看到,大体上是一样的,有少许像素点差值为16,-16.把这些点收集起来,会组成另一张图片,该图片详情参考Arecibo message 维基百科,上面有很详细的解释。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from PIL import Image
import numpy as np

def mapIdx(c, maxIter=128):
z = 0
for k in range(maxIter):
z = z * z + c
if np.abs(z) > 2:
break
return k

def solve():
left = 0.34
bottom = 0.57
width = 0.036
height = 0.027

im = Image.open('data/mandelbrot.gif')
imdata = np.array(list(im.getdata()))
im_w, im_h = im.size
dw = width / im_w
dh = height / im_h
xx = np.linspace(left, left+width-dw, im_w)
yy = np.linspace(bottom, bottom+height-dh, im_h)
yy = yy[::-1]
xx.shape = (1, im_w)
yy.shape = (im_h, 1)
grids = xx + 1j * yy

for i in range(im_h):
for j in range(im_w):
grids[i, j] = mapIdx(grids[i, j])

im.putdata(grids.reshape((-1,)))
im.show()

imdata.shape = (480, 640)
diffs = imdata - grids
msg = diffs[np.where(np.abs(diffs) == 16)]
newIm = Image.new('1', [23, 73])
newIm.putdata([i < 0 for i in msg])
newIm.save('level31_Out.png')

if __name__ == "__main__" : solve()

代码要跑一阵子,主要是把每个复数映射为相应的idx耗时较长。

下一关:arecibo http://www.pythonchallenge.com/pc/rock/arecibo.html