Python Challenge_0-6

最近学习python,发现一个好玩的网站,于是试着开始玩~

网址如下:

http://www.pythonchallenge.com


00


Hint: try to change the URL address.
从图片可知
2^38=274877906944
修改0.html ⇒ 274877906944.html
(http://www.pythonchallenge.com/pc/def/0.html)
完毕~

01

从图片可知为移位加密
破译即可。
采用str.maketrans().
代码如下:

#在Jupyter notebook测试通过
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.
'''
intab=’abcdefghijklmnopqrstuvwxyz'
outtab=’cdefghijklmnopqrstuvwxyzab'
transtab=str.maketrans(intab,outtab)
print(text.translate(transtab))

输出结果:

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进行转换即可(http://www.pythonchallenge.com/pc/def/map.html)

#在Jupyter notebook测试通过
text='''map'''
intab=’abcdefghijklmnopqrstuvwxyz'
outtab=’cdefghijklmnopqrstuvwxyzab'
transtab=str.maketrans(intab,outtab)
print(text.translate(transtab))

输出结果为:

ocr

​完毕~

02

打开调试模式,拷贝代码层乱码,进行分类统计,找出出现次数最少的元素即可。
这里采用collections.Counter().most_common() 进行统计。
代码如下:


from collections import Counter
text='''........#此处乱码省略
        '''
Counter(text).most_common()[:-11:-1] #取频率最小的十个元素进行查看

结果:

[('>', 1),
 ('y', 1),
 ('t', 1),
 ('i', 1),
 ('l', 1),
 ('a', 1),
 ('u', 1),
 ('q', 1),
 ('e', 1),
 ('<', 1)]

​排除尖括号,剩余元素排列恰好是 equality,更换url即可。

完毕~


03

和上一关一样,不过这一次是要求字符匹配,按照题目要求,应该是xXXXxXXXx格式,最中间的x是要得到的关键,我们采用正则表达式进行匹配。

#在Jupyter notebook测试通过
import re text='''........(乱码省略)''' result=re.findall('[a-z]{1}[A-Z]{3}[a-z]{1}[A-Z]{3}[a-z]{1}',text) l=[] for_ in result: l.append(_[4]) print(l)

结果如下:

['l', 'i', 'n', 'k', 'e', 'd', 'l', 'i', 's', 't']

​修改url为linkedlist.html,发现失败,提示为linkedlist.php,再次修改,成功!

完毕~

04

这一关是考验爬虫了,我用requests进行抓取和迭代!

代码如下:

import requests
import re
url = 'http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=63579'
url2= 'http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing='
r = requests.get(url).text
s=[]
while (1):
    num = re.findall('[0-9]{1,}',r)
    s.append(num)
    if (num):
        url_next=url2+num[0]
        print(url_next)
        #print(num)
    else:break
    r = requests.get(url_next).text
print(len(s))
print(url_next)

​这里有个小问题,当迭代到86次时,Body里提示的是乘法口诀,不是现成的数字,要求用当前数字除以2得到下一个nothing,好吧,我手动改掉了。当下一次迭代到55次时,提示说这个nothing出错了,要求返回上一个,我又人工检查了一下,发现有两个nothing,好吧,第二个才是正主,我又被忽悠了。终于,再迭代110次时,登顶了~~~结果是peak.html!!!

不过还好,幸亏只有两百来个数据,要是成千上万我绝对不玩了。。。

完毕~

05

好吧,这一关我完全懵了。。。

参照大神攻略,才知道是用pickle对序列化的banner.p文件进行对象化输出~~

果然大神脑洞无上限,看来要再接再厉啊!

首先查看源代码,发现标签banner.p链接指向新网页,点击打开发现果然又是乱码,然后右键保存,接着用pickle进行load,最后要能够分析出来这是一道画图题,好吧,我输了!!!

不多说,代码如下:

import pickle
f = open('banner.p','rb') #打开文件
data = pickle.load(f)
str=''
for i in data:
    for k in i:
        str+=k[0]*k[1] #由题意可得(反正我得不出),k[0]表示画图的符号,k[1]表示画图符号的数目
    str+='\n'#每个列表画完后轻轻地加上一个回车
print(str)#画图
f.close()

然而,逻辑最终还是表现出了她的美丽,图如下:


              #####                                                                      #####
               ####                                                                       ####
               ####                                                                       ####
               ####                                                                       ####
               ####                                                                       ####
               ####                                                                       ####
               ####                                                                       ####
               ####                                                                       ####
      ###      ####   ###         ###       #####   ###    #####   ###          ###       ####
   ###   ##    #### #######     ##  ###      #### #######   #### #######     ###  ###     ####
  ###     ###  #####    ####   ###   ####    #####    ####  #####    ####   ###     ###   ####
 ###           ####     ####   ###    ###    ####     ####  ####     ####  ###      ####  ####
 ###           ####     ####          ###    ####     ####  ####     ####  ###       ###  ####
####           ####     ####     ##   ###    ####     ####  ####     #### ####       ###  ####
####           ####     ####   ##########    ####     ####  ####     #### ##############  ####
####           ####     ####  ###    ####    ####     ####  ####     #### ####            ####
####           ####     #### ####     ###    ####     ####  ####     #### ####            ####
 ###           ####     #### ####     ###    ####     ####  ####     ####  ###            ####
  ###      ##  ####     ####  ###    ####    ####     ####  ####     ####   ###      ##   ####
   ###    ##   ####     ####   ###########   ####     ####  ####     ####    ###    ##    ####
      ###     ######    #####    ##    #### ######    ###########    #####      ###      ######

​相信不用我说了,下一关,走起~
完毕~

06

这一关涉及到zip文件的处理,之前没太接触过,参照大神指点,顺利通关。

首先是将channel.html改为channel.zip,可以下载到一个压缩包,打开压缩包中readme文件,提示很明显,zip文件迭代~

不多说,代码如下:

import zipfile,re #导入对zip文件处理的模块 zipfile
z=zipfile.ZipFile("channel.zip","r")#以只读的方式打开zip文件
f0="90052.txt"#从readme.txt中获取的tip,开始的第一个文件
count=1
file=f0
while(1):
    text_byte=z.read(file)#读取zip中的文件信息,此时拿到是数据是byte字节数组
    text=text_byte.decode(encoding="utf-8")#转化为字符串
    result=re.findall("[0-9]",text)#注意这里得到的是列表格式
    res_str=''.join(result)#将列表内容转化为字符串
    file=res_str+".txt"
    count+=1
    if (result):key_file=file
    else:break
print("the number is:",count,",the key filename is ",key_file)
key_text=z.read(key_file).decode(encoding='utf-8')
print(key_text)

结果:

the number is: 910 ,the key filename is  46145.txt
Collect the comments.

果然没有那么简单~原来zip文件时候可以添加comment的,而且有人将所有文件的comment集合起来当作密钥,学到一招,不错~
我们继续修改代码,抓取comment信息。
代码如下:

import zipfile,re #导入对zip文件处理的模块 zipfile
z=zipfile.ZipFile("channel.zip","r")#以只读的方式打开zip文件
f0="90052.txt"#从readme.txt中获取的tip,开始的第一个文件
count=1
file=f0
comments=[]
while(1):
    text_byte=z.read(file)#读取zip中的文件信息,此时拿到是数据是byte字节数组

    comments.append(z.getinfo(file).comment)#搜集comment信息

    text=text_byte.decode(encoding="utf-8")#转化为字符串
    result=re.findall("[0-9]",text)#注意这里得到的是列表格式
    res_str=''.join(result)#将列表内容转化为字符串
    file=res_str+".txt"
    count+=1
    if (result):key_file=file
    else:break
print("the number is:",count,",the key filename is ",key_file)
key_text=z.read(key_file).decode(encoding='utf-8')
print(key_text)
str=''
for i in comments:
    str+=''.join(i.decode(encoding='utf-8'))
print(str)

又是画图题有没有,好,上图:

the number is: 910 ,the key filename is  46145.txt
Collect the comments.
****************************************************************
****************************************************************
**                                                            **
**   OO    OO    XX      YYYY    GG    GG  EEEEEE NN      NN  **
**   OO    OO  XXXXXX   YYYYYY   GG   GG   EEEEEE  NN    NN   **
**   OO    OO XXX  XXX YYY   YY  GG GG     EE       NN  NN    **
**   OOOOOOOO XX    XX YY        GGG       EEEEE     NNNN     **
**   OOOOOOOO XX    XX YY        GGG       EEEEE      NN      **
**   OO    OO XXX  XXX YYY   YY  GG GG     EE         NN      **
**   OO    OO  XXXXXX   YYYYYY   GG   GG   EEEEEE     NN      **
**   OO    OO    XX      YYYY    GG    GG  EEEEEE     NN      **
**                                                            **
****************************************************************
 **************************************************************

​HOCKEY!!!
完毕~


你可能感兴趣的:(Python Challenge_0-6)