2014年10月9日 星期三 子夜 晴

Level18 http://www.pythonchallenge.com/pc/return/balloons.html

表面上的蛛丝马迹:

  1. can you tell the difference?
  2. 文件名和url都是balloons,但图片明显是鹅。

最主要的是图片左半部分和右半部分是相似的,仿佛右边更暗一些。对于这句话的理解,我的程序员的直觉是,用左半图减去由半图,就能得到一些东西出来。

于是我写了下面的代码: [code]def Challenge18(): import Image im = Image.open(“balloons.jpg”) w,h = im.size for y in range(h): for x in range(w // 2): im.putpixel((x,y),tuple([color[0] - color[1] for color in zip(im.getpixel((x,y)),im.getpixel((x+w//2,y)))])) im.show()[/code]

显示出来的图片,并不理想,显然除了暗一点外没啥变化。百思不得其解之下,不得不求助Google,发现被作者玩了,竟然不写程序或者没有别的暗示,就能给出 brightness这个关键词,一点都不obvious。

访问http://www.pythonchallenge.com/pc/return/brightness.html ,显示图片是一样的,但源码不一样了,新注释是。有时候真想打出题的,做道题要做多少前戏。下载http://www.pythonchallenge.com/pc/return/deltas.gz ,解压发现delta.txt由16进制数字组成,网络搜索“89 50 4e 47 ”,发现是png的文件头。delta.txt,用不同的编辑器打开是不一样的,一开始我偷懒用了windows自带的记事本,后来我用UE打开才发现文件被整齐地分成两部分,都是png,但长度不一样。下意识还原出两张png图片来,但却打不开。在文件里搜89 50 4e 47 0d 0a 1a 0a ,发现有四个89 50 4e 47 0d 0a 1a 0a 开头的,难怪还原不出来。

让我们回到delta来,我想还是找左右两栏的delta,然后再拼成png图片得到答案。说是这么说,下面的这些带莪们,却折腾了我一个多小时。有时候拼成的图片,都怀疑是自己的图片浏览器出问题了。

[code]def Challenge18b(): import difflib with open(‘delta.txt’) as f: #比较出差异 block1, block2 = [], [] for line in f.readlines(): block1.append(line[:53]+’\n’) block2.append(line[56:]) diff = difflib.ndiff(block1,block2)

#根据差异发现是-,+和空格开头,这不就是diff文件格式嘛,分别拼成三张图 img1,img2,img3 = [],[],[] for line in diff: bytes = [chr(int(i,16)) for i in line[2:].split()] if line.startswith(’-’): img1.extend(bytes) elif line.startswith(’+’): img2.extend(bytes) elif line.startswith(’ ‘): img3.extend(bytes) with open(‘img1.png’,‘wb’) as f: f.write(’’.join(img1)) with open(‘img2.png’,‘wb’) as f: f.write(’’.join(img2)) with open(‘img3.png’,‘wb’) as f: f.write(’’.join(img3))[/code]

根据得到的三张图片,获悉http://www.pythonchallenge.com/pc/hex/bin.html, 用户名 butter,密码 fly