Python challenge攻关6-11

第6关

网址:
http://www.pythonchallenge.com/pc/def/channel.html
思考:
网页上同样没有任何提示,查源码。源码中还有一段:<– zip –> 比较奇怪将网页URL后缀名改成zip,改完后会下载一个ZIP文件,打开后有一堆的txt文件,线索就在其中的一个readme.txt里

welcome to my zipped list.
hint1: start from 90052
hint2: answer is inside the zip

打开90052.txt,内容是Next nothing is 94191,看来这题是跟第四题一样,找next nothing。同时要用到对ZIP的处理。

import urllib, zipfile, re, collections

o, n, f = [], "90052", "%s.txt"
nnr = "Next nothing is (\d+)"

# Download the ZIP file from http://www.pythonchallenge.com/pc/def/channel.zip

file = zipfile.ZipFile("channel.zip")

while True:
    try:
        n = re.search(nnr, file.read(f % n)).group(1)
    except:
        print file.read(f % n)
        break

    o.append(file.getinfo(f % n).comment)

print "".join(o)

最后打印出: 字符HOCKEY应该就是过关答案了。 将hockey应用到url上,出现it’s in the air. look at the letters. 原来还有个小关卡。提示说,空气里有这东西,并且让我们看看刚才那图案。我们发现 HOCKEY 分别由 oxygen 组成
打开oxygen.html 页面,下一关

第7关

网址:
http://www.pythonchallenge.com/pc/def/oxygen.html
思考:
查看标题栏,显示“smarty”
打开来只有一幅图片:
这里写图片描述
信息隐藏在中间那个灰度条中嘛?好吧我们来处理图片好了。Python Imaging Library 提供了 Image 模块,可以用来处理图片。
既然要处理和图片有关的东西,那就应该理解一下PIL库,其中有一个Image模块可以处理图片。用GIMP打开oxygen.png图片,发现其大小为629*95,而灰色区域第一块有5个像素,接着是85个有7个像素的区段,最后是一个8个像素的区段,我们可以从第50行采样。Image 模块提供了 getpixel 来获得某个像素点上的 RGBA 值(RGB 是颜色,A 是不透明度)。对于灰度图片来说,RGB 三者的值应该相等,我们可以据此提出所需的灰度部分,然后进行判断。

import Image,re  

image = Image.open('oxygen.png')
#http://www.pythonchallenge.com/pc/def/oxygen.png
data = image.convert('L').getdata()
message = []
for i in range(0,image.size[0],7):
        message.append(chr(data[image.size[0]*50+i]))

print ''.join(message)

>>> 
smart guy, you made it. the next level is [105, 110, 116, 101, 103, 114, 105, 116, 121]

关键信息包含在[]的9个数值上,转换为ASCII码:

numbers = [105, 110, 116, 101, 103, 114, 105, 116, 121]
word = []
for number in numbers:
        word.append(chr(number))
print ''.join(word)

得到单词integrity,进入页面integrity.html ,通关

第8关

网址:
http://www.pythonchallenge.com/pc/def/integrity.html
思考:
查看标题栏“working hard”
图片上有一只蜜蜂,还有一条信息“Where is the missing link?”
鼠标点击蜜蜂会进入到下一关的页面!!!不过没这么简单,要输入密码的。输入密码提示单词 inflate, 意为膨胀,于是回到第八关页面,右键查看网页源代码,发现注释部分有

un: ‘BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00
\x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084’ pw:
‘BZh91AY&SY\x94 |\x0e\x00\x00\x00\x81\x00\x03
\x00!\x9ah3M\x13<]\xc9\x14\xe1BBP\x91\xf08’

BZh9 是 bz2 压缩的著名起始字符。结合 inflate, 不难联想到,我们的任务是通过 un 和 pw 后面的内容,用 bz2 解压得到 username 和 password.

import bz2

un="BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!" \
     "\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084"
pw = "BZh91AY&SY\x94$|\x0e\x00\x00\x00\x81\x00\x03$ \x00!" \
     "\x9ah3M\x13<]\xc9\x14\xe1BBP\x91\xf08"

print "user name:", bz2.decompress(un)
print "password:", bz2.decompress(pw)

>>> 
user name: huge
password: file

得到结果 huge 和 file, 进入下一关

第9关

网址:
http://www.pythonchallenge.com/pc/return/good.html

思考:
查看标题栏“connect the dots”,提示我们,连点成线
查看网页源码发现里面有

提示 first + second = ?, 以及两个很长的 list.

我们将这两个 list 当作是坐标来连线,用 PIL 的 ImageDraw 模块可以搞定

import Image, ImageDraw

first = [ ... ]
second = [ ... ]

newImage = Image.new('RGB', (640,480))
draw = ImageDraw.Draw(newImage)
draw.line(first)
draw.line(second)
del draw
newImage.save('./good.png')

这里写图片描述
发现最终的图案很像是一头牛bull,进入页面bull.html

第10关

网址:
http://www.pythonchallenge.com/pc/return/bull.html
思考:
查看标题栏“what are you looking at”

len(a[30])

我们点击图片上的牛,进入 http://www.pythonchallenge.com/pc/return/sequence.txt, 发现了一个不完整的数字序列:a = [1, 11, 21, 1211, 111221,. 所以我们的任务是找这个序列的规律,然后找到它的第 30 项然后返回长度。
解决办法:
把序列放 Google 里搜索,发现这是一个叫做「外观序列」的东西,参见维基百科。意思是,序列的后一项是对前一项的描述。比如 11 表示「一个 1」,也就是前一项的 1;又比如 111221 表示「一个 1, 一个 2, 两个 1」,也就是前一项的 1211.

import re

initNum = '1'
for each in range(30):
    initNum = "".join([str(len(i + j)) + i for i, j in re.findall(r"(\d)(\1*)", initNum)])

print len(initNum)
>>> 
5808

其中的 (\d)(\1*) 表示匹配任意数字的连续,也就是匹配 111, 22 这样的序列,得到答案5808

第11关

网址:
http://www.pythonchallenge.com/pc/return/5808.html
思考:
查看标题”odd even”(奇偶)
仔细查看图片,会发现图片的「颗粒化」现象很严重——几乎每一个像素点的旁边,都有黑色的颗粒。再结合「奇偶」这个提示,猜想图片是两张图拼接起来的,像素坐标的奇偶分别对应着一张图。

import Image

# download the image from: http://www.pythonchallenge.com/pc/return/cave.jpg

image = Image.open("cave.jpg")
nsize = tuple([x / 2 for x in image.size])
odd = even = Image.new(image.mode, nsize)

for x in range(image.size[0]):
    for y in range(image.size[1]):
        if x % 2 == 0 and y % 2 == 0:
            even.putpixel((x / 2, y / 2), image.getpixel((x, y)))
        elif x % 2 == 0 and y % 2 == 1:
            odd.putpixel((x / 2, (y - 1) / 2), image.getpixel((x, y)))
        elif x % 2 == 1 and y % 2 == 0:
            even.putpixel(((x - 1) / 2, y / 2), image.getpixel((x, y)))
        else:
            odd.putpixel(((x - 1) / 2, (y - 1) / 2), image.getpixel((x, y)))

even.save("even.jpg")
odd.save("odd.jpg")

可以看到图中的 evil 字样。这就是下一关的钥匙

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值