python challenge 7-12关 攻略

7

http://www.pythonchallenge.com/pc/def/oxygen.html

没有提示,源代码也是什么都没有。好吧。只有一张图片,而且这张图片也挺奇怪的,为什么中间有一横条,感觉有什么玄机。我们能处理的也只有这张图片了。谷歌学习Python的图像处理Python Imaging Library(PIL)


代码:

lxim = Image.open("oxygen.png")
lxpix = lxim.load()
lxsize = lxim.size  # size是(width, height)的形式
lxwid = lxsize[0]
lxhei = lxsize[1]
print "width", lxwid
print "height", lxhei


输出:

width 629

height 95


先输出图片的长和宽,中间一整条大概在中间位置,高度取一半,然后输出每个像素的参数看看


代码:

i = lxhei/2
result = []
for j in range(lxwid):
    lxpixx = lxpix[j, i]
print lxpixx


 

结果输出:

(115, 115, 115, 255)

(115, 115, 115, 255)

(115, 115, 115, 255)

(115, 115, 115, 255)

(115, 115, 115, 255)

(109, 109, 109, 255)

(109, 109, 109, 255)

(109, 109, 109, 255)

(109, 109, 109, 255)

(109, 109, 109, 255)

(109, 109, 109, 255)

(109, 109, 109, 255)

(97, 97, 97, 255)

(97, 97, 97, 255)

(97, 97, 97, 255)

(97, 97, 97, 255)

(97, 97, 97, 255)

(97, 97, 97, 255)

(97, 97, 97, 255)

(114, 114, 114, 255)

(114, 114, 114, 255)

(114, 114, 114, 255)

(114, 114, 114, 255)

(114, 114, 114, 255)

(114, 114, 114, 255)

(114, 114, 114, 255)

(116, 116, 116, 255)

(116, 116, 116, 255)

(116, 116, 116, 255)

(116, 116, 116, 255)

(116, 116, 116, 255)

(116, 116, 116, 255)

(116, 116, 116, 255)

(32, 32, 32, 255)

…….

 

可以看出7个像素一组。但是第一组只有5个,不会影响什么…(因为除以7嘛,只要在一个组里的得到的值都是一样的,所以无所谓在第一个还是最后一个)


代码:

str = ""
for j in range(lxwid/7):
    lxpixx = lxpix[j*7, i]
    str += chr(lxpixx[0])
 
str1 = re.findall(r'[0-9]{3}', str)
for k in str1:
print chr(int(k)),

输出:integrity 过关!

 

第8关

http://www.pythonchallenge.com/pc/def/integrity.html

看hint:where is the missing link? 不清楚是什么,看源代码,中间coords一堆数字,估计是要找规律?看最底下un和pw,应该是username和password。coords旁边有个链接href=”../return/good.html”,点击进入弹出框要输入用户名和密码。将un和pw一长串东西粘进去提示flate,就知道不会这么简单。一开始猜测是不是某种加密方式,试了md5和base64均不行,unicode转码也不行。貌似卡在这里了。再静下来看这两串字符串,开头都是一样的,BZh91AY&SY…. 于是将这段拖到谷歌里面搜索,出现了python的bz2模块,这是一个压缩和解压模块。使用这个模块的解压功能,


代码:

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 bz2.decompress(un)
print bz2.decompress(pw)

输出

huge

file

 

输入用户名和密码得到一个新的网页,过关。

 

第9关

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

 

没有提示,查看源代码得到了first和second两串整数组,网页的title写着将点连起来。还是使用PIL进行画图。

 

代码:

from PIL import Image, ImageDraw
 
# 从源代码中自行添加
first = []
second = []
 
img = Image.open("good.jpg")
newImg = Image.new(img.mode, img.size)  # 创建一张新的图片
draw = ImageDraw.Draw(newImg)
draw.line(first, fill='#fff')  # 白色线条
draw.line(second, fill='#fff')
del draw
newImg.save('result.png')

 

结果:

python challenge 7-12关 攻略_第1张图片

一头牛

然后去搜牛的单词,什么cattle, cow, ox ,bull都去试试。最后发现是bull

PS:原来这关和上一关没联系。那上一关的coords没用上啊。我还一直在想那一串数字能干嘛呢。

 

第10关

http://www.pythonchallenge.com/pc/return/bull.html

根据提示len(a[30])=? 那么a在哪呢,看源代码有一个coords,还有一个连接href=”sequence.txt”,点击得到了a = [1, 11, 21, 1211, 111221,

看了半天a,没发现规律。谷歌一下发现这是一个Look-and-say sequence(看读序列)

举例如下:

1, 11, 21, 1211, 111221, 312211, 13112221, 1113213211, ...

序列的生成过程如下(后一个数为前一个数的数字个数+数字本身的序列):

  1 读为 1个1,所以后一个数记为 11

  11 读为 2个1,所以后一个数记为 21

  21 读为 1个2,1个1,所以后一个数记为 1211

  1211 读为 1个1,1个2,2个1,所以后一个数记为 111221

  111221 读为 3个1,2个2,1个1,所以后一个数记为 312211

……

代码1:

def look_and_say(member):
    while True:
        yield member
        breakpoints = ([0] + [i for i in range(1, len(member))
                              if member[i-1] != member[i]]
                       + [len(member)])
        groups = [member[breakpoints[i-1]:breakpoints[i]]
                  for i in range(1, len(breakpoints))]
        member = ''.join(str(len(group)) + group[0] for group in groups)
 
 
sequence = look_and_say("1")
for i in range(31):
print len(sequence.next())


这是网上找到的一份代码,函数部分没有太搞懂

 

代码2:

import re
 
def describe(s):
    return "".join([str(len(m.group(0))) + m.group(1)
                    for m in re.finditer(r"(\d)\1*", s)])
 
s = "1"
for dummy in range(30):
    s = describe(s)
print len(s)


注意的地方:

finditer返回一个迭代器

正则表达式中\分组,引用编号为的分组匹配到的字符串

虽然代码写的很简洁,但是对于渣渣的我来说真的很有难度,写不出来啊。

 

好吧,上我看得懂写的出的代码吧,(捂脸…)

 

代码3:

a = ['1']
sequence = '1'
 
for i in range(30):
    end = len(sequence)
    current = 0
    begin = 0
    next_seq = []
    while current < end:
        if sequence[current] != sequence[begin]:
            next_seq.append(str(current-begin) + sequence[begin])
            begin = current
        current += 1
 
    next_seq.append(str(current-begin)+sequence[begin])
    # 最后一个字符
 
    sequence = ''.join(next_seq)
    a.append(sequence)
 
print len(a[-1])


输出结果:

5808

 

吐糟一下:coords两次都没用到,放在源代码里面真的是干扰视线啊喂!!

 

第11关

http://www.pythonchallenge.com/pc/return/5808.html

提示和源代码什么都没有,只有一张图,title写着odd even,意思是奇偶。看别人的攻略才知道是要将图中的奇数和偶数像素进行分离。一开始对于奇偶像素的区分不清。看攻略才知道是这样分:长宽都是偶数或者奇数就算像素是偶数,其他的算是奇数。

 

代码:

from PIL import Image
 
img = Image.open("cave.jpg")
 
# 获取原图的长和宽  640 480
width = img.size[0]
height = img.size[1]
 
# even 奇数 odd 偶数
even = odd = Image.new(img.mode, (width/2, height/2))  # 创建新的图片
 
for i in range(width):
    for j in range(height):
        pixel = img.getpixel((i, j))  # 获取图片每个像素点
        if i%2 == 0 and j%2 == 0:  # 都是偶数
            odd.putpixel((i/2, j/2), pixel)
        elif i%2 == 1 and j%2 == 0:  # 长是奇数,宽是偶数
            even.putpixel(((i-1)/2, j/2), pixel)
        elif i%2 == 0 and j%2 == 1:  # 长是偶数,宽是奇数
            even.putpixel((i/2, (j-1)/2), pixel)
        elif i%2 ==1 and j%2 == 1:  # 都是奇数
            odd.putpixel(((i-1)/2, (j-1)/2), pixel)
 
odd.save('odd.png')
even.save('even.png')


结果截图:


python challenge 7-12关 攻略_第2张图片


两张图都是一样的,得到evil

 

第12关

http://www.pythonchallenge.com/pc/return/evil.html

此题我完全是蒙圈的,好吧。是我智商捉急+知道的真的太少啦!!

 

从图入手,为什么叫evil1.jpg呢,那是因为还有evil2啊,将图片地址

http://www.pythonchallenge.com/pc/return/evil1.jpg改为

http://www.pythonchallenge.com/pc/return/evil2.jpg

提示将.jpg改为.gfx。改完后下载了一个evil2.gfx。表示根本搞不懂这是什么文件。(叹气…)

 

一开始分配的图,表示将文件分成五份,用二进制的方式rb读取。

 

代码:

file = open("evil2.gfx", 'rb')
content = file.read()
for i in range(5):
    file = open('evil_%d.jpg' % i, 'wb')
    file.write(content[i::5])
    file.close()
file.close()


结果:

dis pro port ional 最后一个单词被划去,因此就是“disproportional”

 

这题真的很难想到,我现在还略蒙代码的实现思路是怎么想出来的。

你可能感兴趣的:(python)