您的位置:首页 > 编程语言 > Python开发

Python challenge通关代码及攻略(9-16)

2016-08-23 15:35 555 查看

第九题



题目分析

图片上和上一题一样。有奇怪的黑点点。此题应该考察的与上题相同也是图像解析类的。

查看源码。



页面上可以下载good.jpg。然后提示first+second=?

然后first和second各对应一系列的数字。那么应该是两个数字加起来,代表一个像素点。

如果我们在原图片上涂黑点,那么看不出什么变化。于是我们新建一个白底图片,再这个上面涂黑点。

考察知识点

Python-Image 基本的图像处理操作(赞)

http://www.aichengxu.com/view/39904

Python图形图像处理库的介绍之Image模块

http://onlypython.group.iteye.com/group/wiki/1372-python-graphics-image-processing-library-introduced-the-image-module

Python Imaging Library (PIL)下载

http://www.pythonware.com/products/pil/

代码及结果

import re, Image

file = open('d:/Python/good.html')
message = re.findall('(<!--[^-]+-->)', file.read(), re.S)[1]
file.close()

first = re.findall('(/d+)',re.findall('first:(.+)second',message,re.S)[0],re.S)
second = re.findall('(/d+)',re.findall('second:(.+)>',message,re.S)[0],re.S)

all = first + second

im = Image.open('d:/Python/good.jpg')
im2 = Image.new(im.mode, im.size)

for x in range(0,len(all),2):
im2.putpixel((int(all[x]),int(all[x+1])),(255,255,255,255))
im2.show()




显示一只牛,那么就是bull

输入http://www.pythonchallenge.com/pc/return/bull.html,即通关

第十题



题目分析

光看网页上显示的 len(a[30])=? 是让我们计算a数组下标为30的元素的长度

不过按照惯例。查看源码



老实说,这一串,并没有什么规律。而且按照 len(a[30])=? 这个提示,应该是会给一个数组让我们算。



此时发现href=”sequence.txt”很可疑,点击后



那么就是要让我们推算这个数组的 len(a[30])=多少

没看出规律。。百度后得知

11— 表示前一个数“1”是 1 个 1;

21— 表示前一个数“11”是 由 2 个 1 组成;

1211— 表示前一个数“21”是 由 1 个 2、1 个 1 组成;

111221— 即 11 12 21 ,表示前一个数“1211”是依次由 1 个 1,1 个 2,

2 个 1组成;

即每个数字描述前面一个数字的组成

考察知识点

找规律。

Python中的除法

http://blog.csdn.net/sicofield/article/details/8613877

地板除(取整除):从Python2.2开始,增加了一个操作符 // ,以执行地板除://除法不管操作数为何种数值类型,总是会舍去小数部分,返回数字序列中比真正的商小的最接近的数字。

代码及结果

strings = ['1','11']

#计算1-30的元素
for i in range(1,31):
#计数器重置
j = 0
temp = ''
#当计数器j小于当前元素的长度时(即当前元素的长度还未计算完毕时)
while j < len(strings[i]):
count = 1
#当计数器j小于前一个元素的长度时且strings[i][j]==strings[i][j+1]
while j<(len(strings[i])-1) and (strings[i][j]==strings[i][j+1]):
j = j + 1
count = count + 1
temp = '%s%d%c' % (temp,count,strings[i][j])
j = j + 1
strings.append(temp)

print (len(strings[30]))




结果是:5808

输入:http://www.pythonchallenge.com/pc/return/5808.html,通关

第十一题



题目分析

这个像马赛克一样的图片是什么鬼。。估计跟图片处理有关。

查看源代码。



点击


考察知识点

图片分析相关(跟第八题,第九题差不多)

很有可能是与图像坐标的奇偶有关,如果我们按照原图片的规格新建一个图片,而在该图片上只在坐标的奇值或者偶值上涂原图片上的点,发现全是黑乎乎的一片;所以我们再次尝试以原片大小的一半来处理

Python-Image 基本的图像处理操作(赞)

http://www.aichengxu.com/view/39904

Python图形图像处理库的介绍之Image模块

http://onlypython.group.iteye.com/group/wiki/1372-python-graphics-image-processing-library-introduced-the-image-module

Python Imaging Library (PIL)下载

http://www.pythonware.com/products/pil/

代码及结果

图片分析,我一向不太擅长。。这是百度的别人的源码。

原作者:

http://blog.csdn.net/billstone/article/details/4546725

import Image

im = Image.open("cave.jpg")
odd = Image.new(im.mode, (im.size[0]/2, im.size[1]/2))
even = Image.new(im.mode, (im.size[0]/2, im.size[1]/2))

for x in range(1,im.size[0],2):
for y in range(1,im.size[1],2):
odd.putpixel(((x-1)/2,(y-1)/2),im.getpixel((x,y)))

for x in range(1,im.size[0],2):
for y in range(1,im.size[1],2):
even.putpixel((x/2,y/2),im.getpixel((x,y)))

odd.save('odd.jpg')
even.save('even.jpg')


运行代码,查看odd.jpg和even.jpg,发现两张图几乎是一样的,通过反色处理,我们在右上角发现evil的字样

输入http://www.pythonchallenge.com/pc/return/evil.html,即通关

第十二题



题目分析

页面没有文字信息,看图片,好像是要分牌。

查看源码



src=”evil1.jpg”只有这个看起来奇怪点,点击,还是显示发牌图片



考虑到图片显示的是发牌,将地址改为evil2.jpg

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



提示上说:不是jpg,是gfx。那么就将后缀名改为gfx,这样就可以得到一个二进制文件。下载到电脑里



继续测试evil3.jpg



试试evil4.jpg

没反应了。。看来最关键的就是evil2.jpg

然后以发牌的方式将文件中的数据分发到五个新文件中,分发方式如下:evil.gfx的第一个字节给第一个文件,第二个字节给第二个文件,第三个字节给第三个文件,第四个字节给第四个文件,第五个字节给第五个文件,第六个字节给第一个文件,第七个字节给第二个文件……

考察知识点

范围解析操作符(::)

http://blog.csdn.net/chamtianjiao/article/details/6406751

代码及结果

在notepad++中,编辑exc12.py

#读取文件里的信息
f = open('evil2.gfx','rb')
content = f.read()
f.close()

#新建一个图片,将文件中的字符开始平均分发
for i in range(5):
f = open('%d.jpg' % i, 'wb')
f.write(content[i::5])
f.close()
print("done!please check your file")




文件夹里有新文件,



点开看按照次序。分别是dis ,pro ,port,ional,最后一个被划掉了,不管它

组合英文单词就是disproportional。

因此,输入http://www.pythonchallenge.com/pc/return/disproportional.html,即通关

第十三题



题目分析

看图文字提示是打电话给恶魔?

查看源码



此时发现

area shape=”circle” coords=”326,177,45” href=”../phonebook.php”很可疑。

Phonebook就是电话簿,既然要打电话给恶魔,肯定要在电话簿里找到恶魔的电话号码~

点击phonebook.php



应该是跟xml有关。

百度后得知,是考察xmlrpclib模块

考察知识点

python使用xmlrpc实例讲解

http://www.jb51.net/article/44515.htm

代码及结果

首先,导入xmlrpclib,然后连接phonebook.php,接着使用listMethods方法查看了一下可使用的方法,发现有一个叫phone方法,再然后使用methodHelp方法查看了一下phone方法的帮助,于是乎这题就解出来了。


import xmlrpclib
xmlrpc = xmlrpclib.ServerProxy("http://www.pythonchallenge.com/pc/phonebook.php")
print xmlrpc.system.listMethods()
print xmlrpc.system.methodHelp('phone')
print xmlrpc.phone('Bert')


最后会得到Bert的电话--555-ITALY

输入http://www.pythonchallenge.com/pc/return/italy.html,即通关

第十四题



题目分析

显示的是一圈面包,下面还有个图片挡住了什么东西?

查看源码



这个源码貌似提示的地方很多~

walk around:绕着走

– remember: 100*100 = (100+99+99+98) + (… :叫我们记住这行算式

两个图片。点击”italy.jpg,还是那个丑面包,没什么好注意的

点击wire.png,



感觉没啥头绪。。不过肯定是跟图片处理有关的

考察知识点

Image模块

代码及结果

这题没做出来,放个做出来的人的链接

http://blog.csdn.net/kosl90/article/details/7341181

l = [[i, i - 1 , i - 1, i - 2] for i in xrange(100, 1, -2)]
l = reduce(lambda x, y: x+y, l)
# print l, len(l)

import Image
org = Image.open('level14.d/wire.png')
org_data = list(org.getdata())
res = Image.new(org.mode, (100, 100))
res_data = res.load()

# (0,0)
#    ---->x
#    |
#    vy
dire = [(1, 0),  # > (x+1, y) right
(0, 1),  # v (x, y+1) down
(-1, 0),  # < (x-1, y) left
(0, -1),  # ^ (x, y-1) up
]

# init
v = 0
org_index = 0
res_pos = (-1, 0)
for times in l:
for i in xrange(times):
# pos will out of index if reset position after setting color
res_pos = tuple(map(lambda x, y: x + y, res_pos, dire[v]))  # (res_pos[0] + dire[v][0], res_pos[1] + dire[v][1])

# f = open('level14.d/log.log','a')
# print >> f, pos
# f.close()

res_data[res_pos] = org_data[org_index]
org_index += 1

v = (v + 1) % 4  # j + 1 if j != 4 else 0

res.save('level14.d/res.png')


最后得到了一只猫的图像,猫叫uzi

输入http://www.pythonchallenge.com/pc/return/uzi.html,即通关

第十五题



题目分析

日历上把26号圈住了,肯定有特别的含义

查看源码



让我们猜这个人是谁。

说he ain’t the youngest, he is the second。他是第二年轻的(在家里排名,不然跟谁比咧?)

buy flowers for tomorrow:也就是说27号,可能是葬礼或生日,需要为这天买花

恩。。好像这题不用python百度一下,或者熟悉欧洲名人事迹的人也能轻松猜出来

那这题考察的意图到底是什么呢?

仔细思考,我们只知道一个27号,只知道年龄,如果我们是对欧洲历史不太了解的(比如说是我),那么我们就需要缩小范围,毕竟现在已经是2016年了,不知道他到底是在哪一年出生的。

怎么缩小范围呢?从日历上来看的话,27号是星期二,这个可以用来缩小范围,那么还有没有别的条件呢?

图片右下角。。很模糊的图片中,数格子,可以发现2月只有29天,所以是闰年。

需要我们求出闰年时,1月27号是星期二的日期。然后再百度查那个人的信息是家中的次子就行了~

日期的处理,选择python的calendar和datetime模块

考察知识点

Python时间模块datetime、time、calendar的使用方法

http://www.jb51.net/article/77971.htm

datetime模块

python的datetime模块功能详解

代码及结果

在nodepad++中,编辑exc15.py

from calendar import isleap
from datetime import date

TUESDAY = 1

#从1800年到2000年
for year in range(1800,2000):
t = date(year, 1, 27)
#是闰年并且1月的27号是星期一
if isleap(year) and t.weekday() == TUESDAY:
print (t.isoformat())




百度这些日期~

很显然是mozat

输入http://www.pythonchallenge.com/pc/return/mozart.html,即通关

第十六题



题目分析

肯定又是图片处理,查看源码



注意这句话let me get this straight

以粉色的点为基准,将其他像素点排成直线,应该就能出结果

考察知识点

image模块

代码及结果

import Image

im = Image.open("mozart.gif")
for y in range(im.size[1]):
#获得像素点
line=[im.getpixel((x, y)) for x in range(im.size[0])]
idx=line.index(195)
line=line[idx:]+line[:idx]
#重新排列像素点
[im.putpixel((x, y),line[x]) for x in range(len(line))]

im.show()


结果:



输入http://www.pythonchallenge.com/pc/return/romance.html,即通关
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: