pythonchallenge(25-28)

一张拼图。。
提示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  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?    #有一个字节错误。
24关曾得到过一个broken.zip,当时没在意。。
MD5模块用于产生消息摘要,用来判断文件是否相同。
遍历法修正错误。
import md5
f = open( 'mybroken.zip' 'rb' ).read()
for  in  range(len(f)):
     for  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  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  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  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  in  range(0, len(g),2)]
 
print  '' .join([chr(i)  for  in  diff  if  i != 42])
出来结果是whodunnit().split()[0] ?
who dunn it发音who done it. ascii的发明人 Guido Van Rossum。
所以答案是Guido.

我现在觉得提示有时候细枝末节,有时候需要很多知识(比如wodunnit就是在侦探小说结尾处经常出现的),有时候不是很明显要靠猜,那就猜呗。。。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值