Gather ye rosebuds while ye may

Python Challenge 11-19


我感觉我是做入迷了
因为确实好玩啊。。。
学到的知识比看书多多了
我这种就适合考前突击


第十一关 图片处理

这一关还是考验图片处理的能力
但是对我来说却是考验安装第三方库、正确使用Stack Overflow 的能力
没有想到这一篇还要更新: 安装 Python 库文件
开始的时候.jpg文件还不能解析,换成了.png,结果一样不能用。。。
重装了与Image相关的库,重新装了
然后就简单了
题目是奇数偶数,然后图片叫做cave,意思就是空了里面有东西
下载下来放大看是这样的:

想了一会儿还以为有另外一个图片拿给我放一起拼起来。。。
放大看其实里面不全是黑色的,话说 mac 的数码测色计真是好用啊
就是把有颜色的都去掉:

1
2
3
4
5
6
7
8
9
from PIL import Image
im = Image.open('cave.jpg')

print im.size
for i in range(640):
for j in range(480):
if (i+j)%2==1:
im.putpixel((i,j),(0,0,0))
im.show()


看不清的话请调亮一点,算了还是我来:


第十二关 gfx 拆分

题目是dealing evil
只有一个图,evil1.jpg:
evil1
然后就什么提示都没有了
想了半天想出来是应该有evilx.jpg
当我看到evil0.jpg是404的时候确实挺失望的
幸好还有evil2.jpg。。。
not jpg - - .gfx
还有 evil3.jpg
no more evils...
还有evil4.jip虽然不是 jpg格式的,但是下载下来打开还是有信息
burt is evil!go back!
查了一下这个.gfx格式 however跟后面解题完全无关了
这里开始不是自己做的
第一幅图里面是有个人在发牌,发了五张
正确的解题是下载evil2.gfx然后步进分成五个图片


第十三关 rpc 协议

是一个电话的图片

查看源文件,跟前面哪个连线一样的,点击某个区域,跳转到这个连接
完全不会做
下面是找到的方法:

xmlrpc是使用http协议做为传输协议的rpc机制,使用xml文本的方式传输命令和数据blablabla…
反正就是要用到python的xmlrpclib模块来连接这个php页面,然后查看其方法,其中有个名为phone方法就是答案。

1
2
3
4
5
6
7
8
9
def disproportional():
import xmlrpclib
xml_rpc = xmlrpclib.ServerProxy("http://www.pythonchallenge.com/pc/phonebook.php")
print xml_rpc.system.listMethods()
print xml_rpc.system.methodHelp('phone')
print xml_rpc.phone('Bert')
>>> ['phone', 'system.listMethods', 'system.methodHelp', 'system.methodSignature', 'system.multicall', 'system.getCapabilities']
Returns the phone of a person
555-ITALY

rpc协议以后来补,however ,答案就是 italy


第十四关 编程

有个螺旋形的面包,源代码提示walk around,<!-- remember: 100*100 = (100+99+99+98) + (... -->
下面一张图,格式相当奇葩10000*1的一个png
猜到了就是读图然后按照螺旋写成一个100*100的图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from PIL import Image
im = Image.open('wire.png')
mi = Image.open('wire0.png')
L = []
for n in range(10000):
L.append(im.getpixel((n,0)))
def round(n):
for i in range(100-2*n):
mi.putpixel((n+i,n),L.pop())
for j in range(99-2*n):
mi.putpixel((99-n,j+1+n),L.pop())
for i in range(99-2*n):
mi.putpixel((98-i-n,99-n),L.pop())
for j in range(98-2*n):
mi.putpixel((n,98-j-n),L.pop())

for i in range(50):
round(50-i)
mi.show()

出来是一只小猫。。。

我就进入cat.html,但是貌似这个不是第十五关,毕竟左上角没有15

cat.html网页源码如下:

1
2
3
4
5
6
7
8
9
10
11
<html>
<title>uzi</title>
<link rel="stylesheet" type="text/css" href="../style.css">
<body>
<center>
<br>
<font color="gold" size="+1">
and its name is <b>uzi</b>. you'll hear from him later.
<br><br><img src="uzi.jpg" width="640" height="480"/>
</body>
</html>

应该是另外一种旋转方法才对。。。
红色的应该就是信息,只绕了一又四分之一圈。。。
结果这样就出来了:

1
2
3
4
5
6
7
8
9
10
from PIL import Image
im = Image.open('wire.png')
mi = Image.open('wire0.png')
L = []
for n in range(10000):
L.append(im.getpixel((n,0)))
for i in range(100):
for j in range(100):
mi.putpixel((i,j),L.pop())
mi.show()


bit
不!可!能!这!么!简!单
果然,猫的名字是uzi,正确的页面应该是 uzi 才对


第十五关 编程

还是得看攻略。。。
这上面这个是1xx6年,右下角说这一年的二月有29天,然后今天是一月26号,这一年的1月27号有事情要买花。
就是查这个<!-- he ain't the youngest, he is the second -->

1
2
3
4
5
6
7
8
9
k = 6
day = 26
for i in range (1006,1997):
if i%4==0 and i%100!=0:
day += 366
else:
day += 365
if day%7 == k and i%4==0 and i%100!=0 and i%10==6:
print(str(i)+' is a leap year and 26.Jan is Monday, and is one of a 1xx6')

把日历打开看了一下才把这个k = 6的值找到,用来校准周信息
第二年轻的就是1956 27.Jan这个是莫扎特的生日


第十六关 list 操作

一张图let me get this straight:

放大看每一行都有且只有一个白紫紫紫紫紫白,每一行都看做循环的,用这个标志对齐

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from PIL import Image
im = Image.open('mozart.png')
L = []
front = []
back = []
for n in range(480):
for m in range(640):
L.append(im.getpixel((m,n)))
L.reverse()
front = L[:L.index(195)]
back = L[(L.index(195)-640):]
L = back+front
for m in range(640):
im.putpixel((m,n),L.pop())
L = []
im.show()

其中的195是我先输出第一行之后找的,本来想找249这个白色的,但是从第二行开始就没有249的白色了,其实可以try、except的,太麻烦了。。。 就找后面的紫色195
reverse()函数把L给反过来再pop(),输出就不是镜像的
看图


第十七关这道题能自己做出来的都是大神

看到cookie现在都果断看不到趣多多了

貌似要改 cookie但是不知道从哪里改呢。。。又要开始查答案了,没意思
左下角是你做过的一道题,我反正记不得了 木头人推磨
果然是这样的,就是在busynothing这个php页面上进行不断获取cookie的事情,然后还要一遍获取cookie:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import urllib2
import urllib
import cookielib
nothing = "44827"
cj = cookielib.CookieJar()
j = "B"
for _ in range(500):
url = 'http://www.pythonchallenge.com/pc/def/linkedlist.php?busynothing='+nothing
global nothing
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)
nothing = urllib2.urlopen(url).read().decode()[27:].strip()
print nothing
for index, cookie in enumerate(cj):
cookie = str(cookie).replace('<Cookie info=','').replace(' for .pythonchallenge.com/>','').strip()
j+= cookie
print j

最后是这样的
BZh91AY%26SY%94%3A%E2I%00%00%21%19%80P%81%11%00%AFg%9E%A0+%00hE%3DM%B5%23%D0%D4%D1%E2%8D%06%A9%FA%26S%D4%D3%21%A1%EAi7h%9B%9A%2B%BF%60%22%C5WX%E1%ADL%80%E8V%3C%C6%A8%DBH%2632%18%A8x%01%08%21%8DS%0B%C8%AF%96KO%CA2%B0%F1%BD%1Du%A0%86%05%92s%B0%92%C4Bc%F1w%24S%85%09%09C%AE%24%90
是以前做过的一道bz2压缩包的解密
但是他又告诉我这个IOError: invalid data stream
又要看答案了好伤心

import urllib
urllib.unquote(j)
然后里面有个加号,这里要把加号去掉:

1
print bz2.BZ2Decompressor().decompress(urllib.unquote_plus(j))

你以为有答案了么?图样

is it the 26th already? call his father and inform him that "the flowers are on their way". he'll understand.

这里要告诉他的爸爸花在路上了。
谁的爸爸?莫扎特的爸爸。怎么告诉他?打电话。
百度莫扎特的爸爸:Leopold
这里又要前面打电话的:

1
2
3
4
5
import xmlrpclib
xml_rpc = xmlrpclib.ServerProxy("http://www.pythonchallenge.com/pc/phonebook.php")
print xml_rpc.system.listMethods()
print xml_rpc.system.methodHelp('phone')
print xml_rpc.phone('Leopold')

他爸爸的电话就有了:555-VIOLIN
你以为答案就出来了么?图样
你要先进violin.html,然后根据提示来到/stuff/violin.php
你以为答案就出来了么?图样
他爸爸就在这里,你要告诉他花在路上了
怎么告诉他?在 cookie里面,幸好我的 chrome还有edit this cookie插件
这个页面新建一个cookie,名字叫info,值为the+flowers+are+on+their+way,然后刷新


第十八关

difference is brigtness
brightness.html

\

download deltas.pz and unzip

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
import difflib

both = open('deltas').read().split('\n')
left,right,fileleft,fileright,filecommon = [],[],[],[],[]

for i in both:
left.append(i[:53])
right.append(i[56:])


print "differing..."
diff = list(difflib.Differ().compare(left,right))


for line in diff:
line += '\n'
if line[0]==' ':
filecommon.append(line[2:])
if line[0]=='+':
fileright.append(line[2:])
if line[0]=='-':
fileleft.append(line[2:])

for n, data in enumerate((filecommon, fileright, fileleft)):
temp = []

for line in data:
temp.extend([chr(int(o, 16)) for o in line.strip().split(" ") if o])

h = open("%s.png" % (n + 1), "wb")
h.writelines(temp)
h.close()


19 (butter+fly)

Content-type: audio/x-wav; name=”indian.wav”
Content-transfer-encoding: base64

download the messy code and store as txt,then base64 decode as a wav file.

1
2
3
4
5
6
import base64  
text = open('indian.txt','r').read()
indian = open('indian.wav','wb')
wav = base64.b64decode(text)
indian.write(wav)
indian.close()

somebody is yelling ‘sorry’, so jump to sorry.html

“what are you apologizing for?”

i can not continue myself, so i googled, sad.

1
2
3
4
5
6
7
8
import wave  
wi = wave.open('indian.wav','rb')
wo = wave.open('indian_out.wav','wb')
wo.setparams(wi.getparams())
for i in range(wi.getnframes()):
wo.writeframes(wi.readframes(1)[::-1])
wi.close()
wo.close()

you are an idiot,hah hah hah


以上