0%

Python Challenge (Level 21)

###第21关

这一关不再是给出一个网址然后解谜,而是用到上一关得到文件——package.pack以及readme.txt, readme有关于这一关的提示:

We used to play this game when we were kids
When I had no idea what to do, I looked backwards.

这一关主要过程是对package.pack文件不断进行解压。根据上一次解压得到的结果,判断下一次解压用zlib还是bz2,以及判断得到的数据是正向的还是要look backwards.

最后解压出来的结果是sgol ruoy ta kool, reverse一下得到look at your logs

也就是说,每次解压的时候,我们要添加一些信息,形成logs. 最后,我们把这个logs打印出来,就可以得到通关信息。

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
import bz2
import zlib
from pprint import pprint

def uncompress(data, logs):
if data[ : 2] == 'x\x9c':
logs.append('*')
return zlib.decompress(data)
elif data[ : 2] == 'BZ':
logs.append('#')
return bz2.BZ2Decompressor().decompress(data)
elif data[-2 : ] == '\x9cx':
logs.append('@')
return zlib.decompress(data[::-1])
elif data[-2 : ] == 'ZB':
logs.append('$')
return bz2.BZ2Decompressor().decompress(data[::-1])
else:
raise ValueError

def solve():
data = open('unreal/package.pack').read()
logs = []
while True:
try:
data = uncompress(data, logs)
except:
print "Decompress ends!"
break
logs.pop(0)
print data
pprint(''.join(logs).replace('*', ' ').split('@'))

if __name__ == "__main__" : solve()

最后得到通关信息——copper,http://www.pythonchallenge.com/pc/hex/copper.html

1
2
3
4
5
6
7
8
9
10
['     ###          ###      ########    ########    ##########  ########',
' ####### ####### ######### ######### ######### #########',
' ## ## ## ## ## ## ## ## ## ## ##',
' ## ## ## ## ## ## ## ## ## ##',
' ## ## ## ######### ######### ######## #########',
' ## ## ## ######## ######## ######## ######## ',
' ## ## ## ## ## ## ## ## ',
' ## ## ## ## ## ## ## ## ## ',
' ####### ####### ## ## ######### ## ## ',
' ### ### ## ## ########## ## ##']