一张拼图。。
提示1 "imagine how they sound" 2 "can you see the waves?"
url后缀以此改为lake1-lake25.wav。声音转为图片,拼起来。
""
"import urllib
#下载音频文件
for i in range(1,26):
url = "
http:
//butter:fly@www.pythonchallenge.com/pc/hex/lake%d.wav" % i
urllib.urlretrieve(url,
'lake%i.wav'
%i)"
""
import wave, Image
img = Image.
new
(
'RGB'
, (300, 300))
for
i
in
range(1, 26):
f = wave.open(
'lake%d.wav'
%i,
'rb'
)
#将音频数据转化成图片数据
patch = Image.fromstring(
'RGB'
, (60, 60), (f.readframes(f.getnframes())))
img.paste(patch, ((i-1)%5*60, (i-1)/5*60))
img.show()
给第19关的地址回信道歉。
用qq邮箱居然就回了。。我还以为要用python的通信功能什么的。。
Never mind that.
Have you found my broken zip?
md5: bbb8b499a0eef99b52c7f13f4e78c24b
Can you believe what one mistake can lead to? #有一个字节错误。
Have you found my broken zip?
md5: bbb8b499a0eef99b52c7f13f4e78c24b
Can you believe what one mistake can lead to? #有一个字节错误。
24关曾得到过一个broken.zip,当时没在意。。
MD5模块用于产生消息摘要,用来判断文件是否相同。
遍历法修正错误。
import md5
f = open(
'mybroken.zip'
,
'rb'
).read()
for
i
in
range(len(f)):
for
j
in
range(256):
newtext = f[:i] + chr(j) + f[i+1:]
if
md5.md5(newtext).hexdigest() ==
'bbb8b499a0eef99b52c7f13f4e78c24b'
:
open(
'mybroken.zip'
,
'wb'
).write(newtext)
break
得到一张写了speed的图片,可答案并不是speed.我也是..还有什么鬼?!
有人故意把speed和boat扯在一起,不是特别有道理,好吧,反正答案是speedboat。。。
里面有一个链接,需要密码访问,所以这关应该是找用户名/密码。
首先
<!-- did you say gif? --> 暗示改名,下载zigzag.gif文件。
<!-- oh, and this is NOT a repeat of 14 -->
zigzag.gif长这个样子,level14是走螺旋恢复出猫的那个。这里不能那么走。
title: between the tables又是什么意思呢?
网上说:每个像素上的信息是调色版的索引值,然后用实际的颜色替换索引号。(出现gif就该往索引值上想,何况还有tables暗示)
import Image, string
im = Image.open(
'zigzag.gif'
)
imdata = im.tostring()
#Returns a string containing pixel data
p = im.palette.getdata()[1][::3]
#RGB相等,因此每三个取一个 获取0-255调色板的RGB值
frm =
''
.join([chr(i)
for
i
in
range(256)])
#0-255变成字符串
table = string.maketrans(frm, p)
imdata_trans = imdata.translate(table)
还没完,还要比较两个字符串的异同。
imdata是原图片像素值转换得到的字符串。
imdata_trans有点晕。
palette #
im.palette ⇒ palette or None
Colour palette table, if any. If mode is “P”, this should be an instance of theImagePalette class. Otherwise, it should be set to None.
这个着实没有看懂。唉,先不管。(imdata_trans是im图像的索引?也是说原来是灰度图像,后来是灰度图像的索引号?那im.palette()是什么意思,主要是这里不懂。)
将两块信息对比,找出不同的位置,记录上面的信息,并标记坐标位置。完成后对记录的信息解码。
diff = [
''
,
''
]
new
= Image.
new
(
'1'
, im.size, 0)
#1-bit。 初始化全为0
for
i
in
range(1, len(imdata)):
#错开一位
if
imdata[i] != imdata_trans[i-1]:
diff[0] += imdata[i]
diff[1] += imdata_trans[i]
new
.putpixel(((i-1)%im.size[0], (i-1)/im.size[0]), 1)
new
.show()
得到图片:
查看diff,diff[0]是bz2压缩得到的,解压得:
../ring/bell.html del assert repeat raise or class is exec return except print return switch from exec repeat e...
一堆乱七八糟的鬼...not keyword, 哦~把解压得到去掉python里的关键字。
import bz2, keyword
content = bz2.decompress(diff[0]).split()
content = list(set(content))
#去重复
notkeyword = [content[i]
for
i
in
range(len(content))
if
not keyword.iskeyword(content[i])]
print
' '
.join(notkeyword)
switch repeat ../ring/bell.html。 (repeat是用户名,switch是密码)
ring-ring-ring...读快了就会成green(图中一片绿色的树木也应和,url改为green.html,yes!green!除了证明猜对了,没有任何用。)
题目,many pairs ring-ring = many pairs green.应该从图片下手。
一对一对的。
绿色通道,相邻像素作差,绝对值非42的转换成ascii码。
from PIL import Image
im = Image.open(
'bell.png'
)
im.load()
#要先load才能split()
r,g,b = im.split()
g = list(g.getdata())
diff = [abs(g[i]-g[i+1])
for
i
in
range(0, len(g),2)]
print
''
.join([chr(i)
for
i
in
diff
if
i != 42])
出来结果是whodunnit().split()[0] ?
who dunn it发音who done it. ascii的发明人
Guido Van Rossum。
所以答案是Guido.
我现在觉得提示有时候细枝末节,有时候需要很多知识(比如wodunnit就是在侦探小说结尾处经常出现的),有时候不是很明显要靠猜,那就猜呗。。。