学python的一个逗逼网站-pythonchallenge闯关历程(1)

最近开始学python,但是大部分都是理论,实操的编程演练比较少,于是查了一下编程刷题的网站:leetcode,pythonchallenge,lintcode,牛客网等,其中LeetCode大家都很熟悉,但是有一定的难度,lintcode则是相应的中文的版本,牛客网专注于求职,特别是应届生求职,而pythonchanllenge这个专门针对于python学习的引起了我的兴趣。

浏览器的搜索框输入challenge,第一个就是该网站,点进去之后,有点像密室逃脱的风格。点击中间“开始挑战”,进入了一个页面,就是一个图,其他哪儿都点击不了了,我有点懵——查了一下才发现,原来已经有很多人写了相应的闯关秘籍发布了。这个页面就是第一题,嫌弃自己智商的同时,也开始对此有强烈的好奇心了。下面就是我的闯关笔记了——不断闯关,不断更新~

ps:所用的python脚本是python3.0

NO0:(序号以图片左上方的为准)

图片的字样为2^38,而下面提示为修改URL,观察该页面的网址http://www.pythonchallenge.com/pc/def/0.html,应该是修改其中的某项,而在python的命令行中输入并得到:

pow(2,38)
274877906944

修改网址中的0为计算结果,回车,页面刷新——第一题通过。

NO1:

图中有一个本子,规律是每个字母往后移两个,下面有一堆杂乱的字母,规律应该是同样的,翻译这段话即可得到答案。代码如下:

def mov2(str):
s=""
for i in str:
if i=='y':
r='a'
elif i=='z':
r='b'
elif i.isalpha():
j = ord(i)
k = j+2
r=chr(k)
else:
r=i
s=s+r
return s

str2='map'
str=" 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. "
print(mov2(str),mov2(str2))

要点有以下几点:

1 考虑非字母,所以要只挑出字母进行处理,字母和ASCII值来回处理,字母转ASCII:ord(),ASCII转字母chr()

2 单独考虑y,z,让其循环前移,否则这两个字母会转化为非字母

翻译得到的是: 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.  根据提示,将URL中的map再进行转化,得到ocr,顺利进入下一幅图片。

NO2:

这个题会稍微难一点。题目的意思是需要从网页源码找到题干:反击点击页面(非图片部分)——查看网页源代码,阅读源代码下面的提示,可以知道题目的意思是在下面一堆乱七八糟的字符中,找到字符数较少的字符。对于这个题目,有一个讨巧的方法,观察乱七八糟的字符,可以看出,大部分都是一些特殊字符,依稀有几个字母,可以用上一题的方法,找出字母即可。但是从学习python的角度来说,应该用python处理这一堆字符,并找出其中出现次数较少的字符。这一题处理方法如下:

1 将这一堆的字符复制进文件,避免放入代码中,显得代码过于混乱,文件可以命名为:file.txt,如果直接放入代码,可以用...   ...的方式

2 统计这一堆中每个字符的个数,使用列表生成式

3 对生成的列表进行排序

4 找出次数最少的几个字符,并且打印出来

具体代码如下:

#统计字母个数,生成一个dict

def rare(str):
dict_char_tmp = {i:str.count(i) for i in str} 
return dict_char_tmp

#对字母个数进行排序
def sort(t):
return sorted(t,key=lambda x:x[1])

#打开文件

 

fp=open(r'C:\Users\lk\Desktop\file.txt','r')
str = fp.read()
fp.close()


k=rare(str)
print(k)
m = sort(k.items())
minvalue = m[0][1] #找出次数最少的字母的出现次数
ans = ""
for i in m: #找出出现次数最少的几个字母,并且打印出该字母
if i[1] == minvalue:
ans = ans + i[0]
print(ans)

最后打印出来的答案是equality,放入URL,进入下一关。

 

  

 

posted @ 2018-09-03 13:59  angelfishone  阅读(2191)  评论(0编辑  收藏  举报