pythonchallenge(21-24)

21. 
这一关没有网址,对给的package.pack文件不断进行解压。根据上一次解压得到的结果,判断下一次解压用zlib还是bz2,以及判断得到的数据是正向还是要look backwards.
import zlib
import bz2
 
data = open( '1/package.pack' , 'rb' ).read()
result = []
 
zh =  'x\x9c'
bh =  'BZ'
 
while  1:
     if  data[:2] == zh:
         data = zlib.decompress(data)
         result.append( ' ' )
     elif data[:2] == bh:
         data = bz2.BZ2Decompressor().decompress(data)
         result.append( '#' )
     elif data[-1:-3:-1]  in  [zh, bh]:  #翻转
         data = data[::-1]
         result.append( '\n' )
     else :
         break
 
print  '' .join(result)
最后得到单词copper.

<!-- or maybe white.gif would be more bright-->
得到一个gif文件,用ps打开,都是全黑的。。之前提示比想象中亮度大。。
每张图有一个白点,绕着中心旋转,把相对中心的位移作为矢量,不断走下去,会形成字母,回到原点一个字母完成。
只是识别这一个像素的白点肉眼有点困难,可以用im.histogram()便可查知。
from PIL import Image
 
im = Image.open( 'white.gif' )
im.seek(1)
new  = Image. new (im.mode, im.size)
current = (50,50)
new .putpixel(current,195)
 
try :
     while  1:
         #获取白点位置,图片大小为200*200
         point = [(i,j)  for  in  range(200)  for  in  range(200)  if  im.getpixel((i,j)) != 0][0]
         if  point == (100,100):
             current = (current[0]+20, current[1] + 20) #位移方便显示
         else :
             step = (point[0]-100, point[1]-100)
             current = (current[0]+step[0], current[1] + step[1])
             new .putpixel(current,195)
         im.seek(im.tell()+1)  #移到下一个序列,默认为0
except EOFError:
     pass
 
new .show()
new .save( 're.gif' )
最后得bonus.

有一张牛的图片。
title:what's is this module?(这是什么模块?)
注释:1. 有礼貌的道歉。 2. 打不开的图片链接下写着“ it can't find it. this is an undocumented module.”3. 最后一行“ 'va gur snpr bs jung?'”什么意思?
最后一行类似level1位移,但不知道位移数,循环查看:
import string
 
input =  'va gur snpr bs jung?'
 
s =  'abcdefghijklmnopqrstuvwxyz'
for  in  range(1,len(s)):
     t = s[i:]+s[:i]
     leet = string.maketrans(t, 'abcdefghijklmnopqrstuvwxyz' )
     print string.translate(input,leet)
什么意思?
what's is this module.python 居然有‘this’ module!!
import this 弹出一串字符串。哦~python的几句编程禅语,优雅胜于...
里面有一句叫
所以ambiguity是答案。。我也是没想到。。
(仔细看提示,到处充斥着‘this’module,至于位移,确实不容易想到)

title: from top to bottom.
不会是迷宫走出一个字母吧。。
根据网页标题,迷宫是 from top to bottom ,黑色像素是路径,白色像素是墙。这张图片大小为641×641,入口在右上角(0, 639), 出口是左下角(640, 1)”。。我也是醉了,我还以为白色的是路呢。。而且,这个出入口是怎么找的啊?!我也是。。
迷宫的路径的Green、Blue通道都是0,而Red通道会0和非0交替。把非0值收集起来,写到文件,就可以得到zip文件
参考别人的代码解。

 入/出口,仔细观察,上下凸出来的部分,还是可以发现。
入口 出口。
确切位置可以程序获得。

import Image,ImageDraw  
img = Image.open( 'maze.png' ).getdata()  
new  = Image. new ( 'RGBA' ,img.size, 'black' )   #新建一张全黑的图片
newimg = ImageDraw.Draw( new )
 
#寻找迷宫入/出口
for  in  range(img.size[1]):
     if  img.getpixel((i,0))[0]==0:  #观察得出入口为黑色,so这里这样判断。不然,非白色(255,255,255,255)
         pos = (i, 0)
     if  img.getpixel((i,img.size[0]-1))[0]==0:
         endpos = (i, img.size[0]-1)
         
path = []
wholepath = []
dire = [(1,0), (0,1), (-1,0), (0,-1)]
wall = (255,)*4   #学习这种写法 (255,255,255,255)
 
#深度优先(DFS)
while  pos != endpos:
     img.putpixel(pos, wall)  #走过的路涂白,避免死循环
     flag = 0
     newpos = pos
     for  in  dire:
         try :
             pp = (pos[0] + i[0], pos[1] + i[1])
             if  img.getpixel(pp) != wall:  #有路
                 flag += 1
                 newpos = pp
         except:
             pass
     if  flag == 0:   #当前点无路可走,死胡同。
         if  path == []:
             path = wholepath.pop()
             continue
         pos = path[0]
         path = []
     elif flag > 1:  #有至少两条路可走
         wholepath.append(path)
         path = [pos]
         pos = newpos
     else :
         path.append(pos)
         pos = newpos
else :
     path.append(pos)
     wholepath.append(path)
 
img = Image.open( 'maze.png' ).getdata()  #必须重新打开,因为之前修改了img.
data = [(img.getpixel(k)[0],  new .putpixel(k, wall))  for  in  wholepath  for  in  i] #路径绘制
out = open( 'out.zip' 'wb' )
for  in  data[1::2]:
     out.write(chr(i[0]))
out.close()
new .save( 'out.png' )
不容易啊。。主要是没用python写过算法。。
out.zip解压出来是一张图,上面写有lake就是答案啦。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值