python challenge level 14 url: http://www.pythonchallenge.com/pc/return/italy.html
这道题很有意思,刚开始的时候下面一张条形码的图完全不知道是干什么的,不过刚看到这个面包的时候,我觉得还好我去吃过饭了,不然肯定精神不集中。这次我首先在页面四处乱点了一通,发现没有什么连接,然后看了看title——walk around,再加上这个面包我想这道题肯定是要绕圈圈了。页面上表面的内容已经解析完了,接下来就是页面源代码了。
在源代码中有一条注释,注释说100*100 = (100 + 99 + 99 + 98)+(...不管怎么样,这条注释肯定是有用的,所以,先在解题的代码中算出这个序列:
#!/usr/bin/env python
'''python challenge level 14
question url: http://www.pythonchallenge.com/pc/return/italy.html
answer url: http://www.pythonchallenge.com/pcc/return/uzi.html
'''
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)
这样就得到了题目所提示的序列,但是这个序列有什么用呢?先放一放。到目前为止,除了wire.png这张图片的作用没有解析出来,其他的提示基本都找到了,那么这种图又有什么玄机呢?秉承着我一直以来的习惯,能点就点的原则,点击了wire.png这张图片,然后chrome给了我一个什么都看不到的页面。这下我可就郁闷了,页面上明明一张可视的图片啊,没办法,把这张图片下载了下来,然后发现这张图是一张很奇怪的图,高:1px,宽:10000px。有了这个发现我先是囧了囧,紧接着就发现10000不就是100*100吗,再结合title和面包的绕圈圈,显然就是要把这张图根据面包的方向来绕圈圈最后就能得到答案了。
思路清晰简单,可是在这里我就卡住了,这张图要从中间一直绕一直绕然后形成一张正方形的图片,这个程序该怎么写呢?还有,那之前求出来的序列又有什么用呢?如果没用干嘛要提示100*100=(100+99+99+98)+(...?直接提示10000=100*100不就好了,还有,为什么要分成四个数字一组?这一切不想通这一题就无法继续。而这一切困扰了我2天,在我洗澡的时候突然发现,我似乎转到牛角尖里去了,是谁说一定要从中间开始一圈一圈的绕了?这又不是做面包,按照面包的纹路还可以从外向内的绕啊!这样以来之前所求的序列也就有意义了,先向一个方向走100个像素,然后转90度,走99个像素,再转90度,再走99个像素,再转90度,再走98个像素,这样就完成了一个圈,而里面只要按照同样的方法绕就能够完成这张图!这一发现令我相当兴奋,真想立刻冲出来,不过哥淡定了一把,因为洗完澡之后就得去学校了,急也没用啊。到了学校可就不用等了,代码很快就写出来了:
#! /usr/bin/env python
'''python challenge level 14
question url: http://www.pythonchallenge.com/pc/return/italy.html
answer url: http://www.pythonchallenge.com/pcc/return/uzi.html
'''
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。借着解决这题的兴奋经马不停蹄,继续下一题!