python challenge level 2的链接为http://www.pythonchallenge.com/pc/def/ocr.html。
level 2同样是采用图加描述的形式,那段描述告诉我们,你可以成为一个神,或者是作为一个正常的程序员。为什么会有神这个选项呢?是因为如果你在这张图里面找到了我们需要的信息,我想你也就做到了人做不到的事情。作为一个正常的未来的程序员还是乖乖的看页面的源代码吧。嘛,很显然,在最下面的一大段注释中就有我们需要处理的信息,接下来需要在那一大堆字符中找出所需要的字符,即出现很少的字符,然后用这些字符组成的字符串替代本题链接中的ocr就可以得到下一题的链接了,那么只要对每个出现的字符计数就行了,这样就有了version 0:
#! /usr/bin/env python # version 0 text = '''...''' # 这里用...来代替那一大段注释,以下程序也是如此 num = {} for i in text: if i in num: num[i] += 1 else: num[i] = 1 for key, val in num.items(): print '%s: %d' % (key, val)
可是等我看到结果的时候我突然想起一件事,python中dictionary的key是无序的,并不是按照加入的顺序显示的,而所需要的信息最大的可能性就是按照字符出现的顺序组成的字符串,于是乎我就囧了。不过,我从中知道了这次需要的信息是什么,说大了就是小写字母,说小了就是'a', 'e', 'i', 'l', 'q', 'u', 't', 'y'。好吧,既然范围已经缩小了,那么就来完成version 1吧:
#! /usr/bin/env python '''python challenge level 2 question url: http://www.pythonchallenge.com/pc/def/ocr.html ''' text = '''...''' s = '' for i in text: if i.isalpha(): s += i print s
这样我们就得到了我们所需要的信息'equality',虽然到目前为止一切都是猜测,但是都是合理的猜测,而且也最终得到了验证,下一题的链接就是http://www.pythonchallenge.com/pc/def/equality.html。想了一下,觉得用正则表达式做似乎也挺方便的,于是就写了一个正则表达式版的解答:
#! /usr/bin/env python '''python challenge level 2 question url: http://www.pythonchallenge.com/pc/def/ocr.html ''' text = '''...''' import re print ''.join(re.findall(r'[a-z]+', text))
完成这道题目后看了看别人的答案,发现自己对python还是不够熟练,虽然可以完成题目,但是不一定可以写出精炼的代码,比如说version 1可以写成:
print ''.join([i for i in text if i.isalpha()])
正则表达式版可以写成:
print re.sub(r'[_|\W]', '', text)
或者
print re.sub(r'[^a-z]', '', text)
这种游戏确实很有意思,不仅可以开阔自己的思路,还可以观看别人的答案学习别人的思路和未知的知识,还可以打法时间,何止是一箭双雕,都四雕了。期待下一题带来的精彩。
PS:今天在微群里面看到一个招聘高级python工程师的信息,上面给出了一个链接,就是这个游戏的链接,并且说完成18题以上就属于高级python工程师