我大学剩下一年半的生活(十五)——pythonchallenge之level14

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。借着解决这题的兴奋经马不停蹄,继续下一题!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值