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.
22. http://www.pythonchallenge.com/pc/hex/copper.html
<!-- or maybe white.gif would be more bright-->
图片 http://www.pythonchallenge.com/pc/hex/level22.jpg
改为 http://www.pythonchallenge.com/pc/hex/white.gif
得到一个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
i
in
range(200)
for
j
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.
23. http://www.pythonchallenge.com/pc/hex/bonus.html
有一张牛的图片。
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
i
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,至于位移,确实不容易想到)
24. http://www.pythonchallenge.com/pc/hex/ambiguity.html
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
i
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
i
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
i
in
wholepath
for
k
in
i]
#路径绘制
out = open(
'out.zip'
,
'wb'
)
for
i
in
data[1::2]:
out.write(chr(i[0]))
out.close()
new
.save(
'out.png'
)
不容易啊。。主要是没用python写过算法。。
out.zip解压出来是一张图,上面写有lake就是答案啦。