我大学剩下一年半的生活(二)——pythonchallenge之level1

我对第0题的解答在这里,现在开始第1题的解答,第一题的题目

第1题的提示是一张图配合一句话再加上一段话。很显然下面那一段话毫无逻辑,毫无意义,肯定是经过加密形成的一段话,所以我们必须对这段话进行解码。同样很明显的,对这一段紫色段落的解码并不是像图中那样将k->m,o->q,e->g这么简单,图下面的那一句话的作用也正是告诉我们这个,经过简单的思考很容易就猜到是对26个字母进行循环移位,那么是移动多少呢?通过对字母表和图片的观察可以发现是将字母表向左循环移动2位。

我首先是处于在C/C++中的习惯,利用asiic表来进行处理,代码如下:

#! /usr/bin/env python
'''python challenge level 1 version 0
question url: http://www.pythonchallenge.com/pc/def/map.html
'''

text = '''g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp.
bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle
qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj. '''

trans_text = ''
for i in text:
    trans_text += chr((ord(i) - ord('a') + 2) % 26 + ord('a')) if i.islower() \
                else i

print trans_text

这段代码的思路很简单,如果是小写字母则移位,并添加到trans_text中,不然就直接添加到trans_text中。至于这种类似与C语言中的条件表达式的写法是由于以前python中并没有这种语句,但编程人员会使用...and...or...的形式来代替,可是这样子的代码可能会出现错误,因此在2.5中加入了条件表达式这种写法。

后来我觉得这样子似乎并不pythonic,而且阅读也比叫麻烦,于是我就想用dictionary来写一个新的,但是如果自己定义一个dictionary的话又比较麻烦,我记得string里面好像有一些已经定义好的东西可以使用,于是我查了一下,便有了下面的代码:

#! /usr/bin/env python
'''python challenge level 1 version 1
question url: http://www.pythonchallenge.com/pc/def/map.html
'''

text = '''g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp.
bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle
qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj. '''

from string import lowercase
alph_map = dict(zip(lowercase, lowercase.[2:]+lowercase[:2]))
trans_text = ''
for i in text:
    trans_text += alph_map[i] if i in alph_map else i

print trans_text

如果觉得判断比较麻烦也可以对中间一段代码进行小幅修改,把标点符号加到dictionary中:

from string import lowercase, punctuation
map = dict(zip(lowercase+punctuation, lowercase[2:]+lowercase[:2]+punctuation))
trans_text = ''
for i in text:
    trans_text += map[i]

不管怎么样,我们会得到下面这样一段话:

i hope you didnt translate it by hand. thats what computers are for.
doing it in by hand is inefficient and that's why this text is so long. using
string.maketrans() is recommended. now apply on the url.
从这段话中我们可以得到两个消息:

  1. 作者希望我们使用string.maketrans这个函数
  2. 我们只要将这个map应用到url上就可以得到下一题的链接了
由于以前string.maketrans这个函数没看过,更别说用过了,我们先放一放,先把下一题的链接搞到手再说。显然,我们只需要对map这三个字母进行转换就行了,最后我们可以得到 http://www.pythonchallenge.com/pc/def/ocr.html,这便是下一题的链接了。

现在回过头来看一看string.maketrans这个函数,在python在线帮助手册中查了一下发现这个函数会生成类似version2中的alph_map的映射表,然后传递给translate这个函数使用。于是乎,就得到了version2:

#! /usr/bin/env python
'''python challenge level 1 version 2
question url: http://www.pythonchallenge.com/pc/def/map.html
'''

text = '''g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp.
bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle
qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj. '''

from string import lowercase, maketrans
alph_map = maketrans(lowercase, lowercase.[2:]+lowercase[:2])
print text.translate(alph_map)  # 如果导入了string中的translate函数,也可以使用translate(text, alph)。

level1到这里就结束了,期待下一题带来的精彩。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值