PythonChallenge_1

来源:互联网 发布:实木床 品牌 知乎 编辑:程序博客网 时间:2024/05/20 06:06

PythonChallenge_1

一、实验说明

1. 环境登录

无需密码自动登录,系统用户名shiyanlou

2. 环境介绍

本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌面上的程序:

  1. LX终端(LXTerminal): Linux命令行终端,打开后会进入Bash环境,可以使用Linux命令
  2. Firefox:浏览器,可以用在需要前端界面的课程里,只需要打开环境里写的HTML/JS页面即可
  3. GVim:非常好用的编辑器,最简单的用法可以参考课程Vim编辑器

3. 环境使用

使用GVim编辑器输入实验所需的代码及文件,使用LX终端(LXTerminal)运行所需命令进行操作。

实验报告可以在个人主页中查看,其中含有每次实验的截图及笔记,以及每次实验的有效学习时间(指的是在实验桌面内操作的时间,如果没有操作,系统会记录为发呆时间)。这些都是您学习的真实性证明。

二、课程介绍

本次PythonChallenge系列一共有11个项目,持续更新中,每个项目课程里面会详细讲解3个pythonchallenge通关题目以及不同解决方案,课后习题里面布置一个任务题,该题目会在下一个项目中被揭开面纱。

本系列题目属于在线闯关题,由于实验楼暂时不提供访问外网,因此请各位验证答案的时候烦劳点击自己的浏览器访问网页以验证答案。

所有题目和参考的解决方案版权归PythonChallenge官网,课程编写属于实验楼原创,欢迎在问答区积极提问,小编会积极解答,也欢迎在评论区吐槽~

三、实验内容

3.1 热身

此处输入图片的描述

问题:尝试根据以上图片,改变URL地址。

小编脑洞:映入眼帘的是三个数字,长得像2的38次方,难道结果就是这个?试试在Python交互式环境算出结果吧~

此处输入图片的描述

麻利解决,看看是不是274877906944?(改变URL地址中的最后一个子链接0即可。)

好神奇好easy有木有,进入下一个链接。额,果然是热身运动,是不是太低估你们的智商了?不要紧,咱们接着玩~

3.2 如何转换?

此处输入图片的描述

问题:大家注意咯,请考虑以下字符串:

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.

小编脑洞:K->M0->QE->G这三个转换都是中间隔了一个字符,分别是LPF;难道说以上乱七八糟字符串转换规则就是每个原字符的ASCII码加2?

首先,通过剪切板将以上字符加载到实验楼环境下的文本test_1.py中:

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."""

接下来,如何将字母转换为ASCII码Python中提供函数ord()将字母转换成ASCII码,提供函数chr()将相对应的ASCII码转化为字母,那么问题很简单,只要依次遍历字符串中的字符,并利用以上函数将字母转化即可:

o = ""for each in text:    if ord(each) >= ord('a') and ord(each) <= ord('z'):        o += chr((ord(each) + 2 - ord('a')) % 26 + ord('a')) # 尝试理解该转换公式    else:        o += eachprint o

看看输出结果:

此处输入图片的描述

由上图给出的答案可知(需要具备四级英语水平,不行就是用在线翻译)将以上方法对url链接中的map进行转换即可。

标准答案

出题人推荐使用函数string.maketrans(),那么这个函数是干嘛用的?

Python交互式窗口输入:

import stringhelp(string.maketrans)

输出函数文档:

此处输入图片的描述

一大堆英文,了解以下信息即可(键盘输入q即可推出文档):

该函数有两个参数frm以及to,这两个参数必须具有相同的长度,该函数返回的是一个转换公式table

与该函数相对应的是函数string.translate,你可以尝试同上面一样查看函数文档;函数string.translate有两个参数分别是字符串s以及转换公式table,返回的是通过该转换公式转换后的字符串s

这么说理论,你们可能无法明白,直接修改原文件test_1.py,添加代码(注意把原来的方法注释掉,或者跟我一样直接把每一种解决方案包装成函数):

此处输入图片的描述

import stringdef std_solution(text):    table = string.maketrans(            string.ascii_lowercase,            string.ascii_lowercase[2:] + string.ascii_lowercase[:2])    print string.translate(text, table)if __name__ == '__main__':    std_solution(text)

仔细看string.maketrans()里面的两个参数,其中string.lowercase指的是小写的26个英文字母a-z,第二个参数是要转换的格式c-z+ab,也就是将每个字符后移两位的方法,因此直接用定义好的方法table,将text字符串应用该方法转换即可。

那么答案很明显,将上面的text内容替换为网页链接中的map字符即可,输出为ocr,尝试打开链接找到下一题的通关口。

3.3 字符识别

此处输入图片的描述

问题:识别出字符串,它们可能在书里面,也可能在源码里面

小编脑洞:书上是基本看不到什么信息,就算有也是大海捞针,既然说是在源码里面,那么我们通过右键“审查元素”查看一下源代码,于是在这个地方:

此处输入图片的描述

的下面找到了一群看起来毫无规律可言的一大堆字符串:

此处输入图片的描述

注意,它有提醒:从下面一团乱的字符串中找出稀有的字符。这个就是我们真正要解决的问题!

由于实验楼环境网络限制,小编已经把那乱七八糟的字符上传到实验楼环境了,请使用如下命令下载文件:

wget http://labfile.oss.aliyuncs.com/courses/408/mess.txt

找出最少的字符,既然是字符,那么就不是普通的符号,直接找出字符试试:

import stringtext = open('mess.txt').read()  # 打开文件读取字符串def my_solution(text):    """从text中挑选出属于英文字母的字符"""    s = filter(lambda x: x in string.letters, text)    print sif __name__ == '__main__':    my_solution(text)

运行结果:

此处输入图片的描述

下一关的网址显然是将equality代入即可。

对于函数filter请同学们积极使用help命令查看函数文档,其中filter的第一个参数是一个lambda函数,第二个参数是字符串序列text

对于lambda的用法,请看以下例子:

此处输入图片的描述

这里的lambda函数,完成同上面普通函数f(x)相同的事情。注意这里的简短的语法:在参数列表周围没有括号,而且忽略了return关键字(隐含存在,因为整个函数只有一行)。而且,该函数没有函数名称,但是可以将它赋值给一个变量如g进行调用。

标准答案

出现次数最少等价于出现的频率低于字符出现频率平均值

我们要从一大堆混乱的字符中找出出现次数最少的字符,诀窍是考虑文本mess.txt中出现次数低于平均水平的字符,我们唯一掌握的信息就是字符是非频繁的,是与url类型兼容的(比如回车符号以及空格符就不再考虑范围内)。

算法如下:

  1. 读取文本内容;
  2. 定义一个字典,里面存储每个字符以及对应出现的频数;
  3. 计算出字符平均稀有情况(所有字符数量/字符数量);
  4. 循环输出稀有性低于平均水平的的字符。
s = ''.join([line.rstrip() for line in open('mess.txt')])    occ = {}for c in s:     occ[c] = occ.get(c, 0) + 1  # 相同的字符,字典的值加1    avgOC = len(s) // len(occ)print ''.join([c for c in s if occ[c] < avgOC])

此处输入图片的描述

这里要注意的是,引用字典的值的时候最好用occ.get(c)而不是occ[c],否则很容易出现KeyError,至于原因,请大家自己思考并利用百度等搜索引擎查询并了解相关知识。

编者评论:虽然官方的答案引用了比较高大上的字典,但是“稀有情况”这个评价指标并不是很好,不符合一般人的评价标准,一般人的评价一般是统计意义的,比如出现的频率。

那么就有人比较聪明的抓住“rare”这个单词,也就是字符数量是稀有的,那么假设就是字符出现的次数就是1呢?

“投机取巧”方案

此处输入图片的描述

其实解决方案就是这么丰富,脑洞就是这么大;那么大家有没有想到一种更pythonic的方式,关于获取那一堆杂乱的字符串是否可以通过python直接获取源代码并选出那一堆字符串直接存储呢?(留给大家作为课外习题)。

四、Task_1

那么,介绍了那么多解决方案的你是否也是跃跃欲试?是不是因为找到这个系列题目的规律呢?那么给你一个机会,解决以下问题:

此处输入图片的描述

问题:如上图所示,下一题的答案提示:找出所有满足以下条件的小写字母,条件是该字母两边分别有三个大写字母做保镖!

小编提示:通往下一题的单词就是由那些满足条件的小写字母构成,另外字符来源可以参考上面的题目给出的解题思路哦!(我是不是说的太明显了~)另外,不一定用python语言解决这个问题,你可以使用你熟悉的语言解决。

0 0
原创粉丝点击