第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