zoukankan      html  css  js  c++  java
  • The Python Challenge 闯关笔记

    The Python Challenge : http://www.pythonchallenge.com/

    Level 0:

    看提示图片中为2**38,计算值为274877906944。

    Hint: try to change the URL address.

    下一关地址:http://www.pythonchallenge.com/pc/def/274877906944.html

    Level 1:

    Hint 1:K->M  O->Q  E->G

    此提示可看出是位移计算,都是位移两位

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

    想必是利用Hint 1的唯一算法转换字符串,得到下一关的地址信息,需要注意的是转换是在26个字母中转换的,不多说,上代码

    s = "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."
    def change_str(s):
        if s is 'y':
            return 'a'
        if s is 'z':
            return 'b'
        if s.isalpha() and s not in 'yz':
            return chr(ord(s)+2)
        return s
    
    ns = map(change_str, s)
    print ''.join(ns)

    解密得到: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.

    根据提示,使用同样的方法转换map,得到ocr

    下一关地址:http://www.pythonchallenge.com/pc/def/ocr.html

    Level 2:

    根据提示密码藏在图片的书中,或者页面源码中,看了下图片果断F12,看到页面源码中有一大段字符串,提示找出重复最少的

    import collections
    def mycount(s):
        lit = []
        lit_num = []
        for item in s:
            if item in lit:
                continue
            lit.append(item)
        for item in lit:
            num = s.count(item)
            lit_num.append(num)
        return collections.OrderedDict(zip(lit, lit_num))
    
    dic = mycount(s)
    for k, v in dic.iteritems():
        print k, '=', v

    由于字符是有顺序的,所以这里我使用了有序的字典,进行存储字符跟出现次数,得到结果为;equality

    下一关地址:http://www.pythonchallenge.com/pc/def/equality.html

    Level 3:

     Hint :One small letter, surrounded by EXACTLY three big bodyguards on each of its sides.

    找到这么一个小写字母,两边都是三个大写字母,要求:xXXXxXXXx

    两边都是连续的三个大写字母,所以再边上就要是小写字母,不然就不满足要求了

    在哪里找这些字符呢??查看页面源码,发现有一大串字符串,一定是在这里找了。

    使用正则表达式进行查找字符串,附上代码:

    regex = r"[^A-Z][A-Z]{3}[a-z][A-Z]{3}[^A-Z]"
    REGEX = re.compile(regex)
    result = REGEX.findall(s)
    print result

    得到:['qIQNlQSLi', 'eOEKiVEYj', 'aZADnMCZq', 'bZUTkLYNg', 'uCNDeHSBj', 'kOIXdKBFh', 'dXJVlGZVm', 'gZAGiLQZx', 'vCJAsACFl', 'qKWGtIDCj']

     取的小写字母得:linkedlist

    访问:http://www.pythonchallenge.com/pc/def/linkedlist.html,得到linkedlist.php

    下一关地址:http://www.pythonchallenge.com/pc/def/linkedlist.php

    Level 4:

    点击图片跳转页面显示:and the next nothing is 44827

     查看页面源码发现: urllib may help. DON'T TRY ALL NOTHINGS, since it will never
    end. 400 times is more than enough.

    尝试把nothing改为44827,页面跳转显示:and the next nothing is 45439

    根据提示应该是要一直访问,访问400次就的到下一关页面

    import urllib
    from bs4 import BeautifulSoup
    
    def challenge(noth):
        url = "http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing={}".format(noth)
        responce = urllib.urlopen(url)
        html = responce.read()
        soup = BeautifulSoup(html, 'lxml')
        body_text = soup.find('body').text
        nothing = (body_text.split('.')).pop()
        if 'html' == nothing:
            print 'Congratulations!!!!-----------------------------------------------'
            print body_text
        else:
            print '-----------------------------------------------------------------'
            print body_text
            nothing = (body_text.split(' ')).pop()
            try:
                if isinstance(int(nothing), int):
                    return challenge(nothing)
            except ValueError:
                nothing = int(noth) / 2
                print nothing
                print '--------------------------------------------------------------'
                return challenge(nothing)

    查看记录得到:peak.html

    下一关地址:http://www.pythonchallenge.com/pc/def/peak.html

    Level 5:

    这题有点坑爹,找不到突破点,百度了下,根据发音的到需要用pickle处理数据,晕....

    查看源码,下载banner.p,打开看了下,确实像是pickle处理过的,使用pickle处理得到

    [[(' ', 95)], [(' ', 14), ('#', 5), (' ', 70), ('#', 5), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 6), ('#', 3), (' ', 6), ('#', 4), (' ', 3), ('#', 3), (' ', 9), ('#', 3), (' ', 7), ('#', 5), (' ', 3), ('#', 3), (' ', 4), ('#', 5), (' ', 3), ('#', 3), (' ', 10), ('#', 3), (' ', 7), ('#', 4), (' ', 1)], [(' ', 3), ('#', 3), (' ', 3), ('#', 2), (' ', 4), ('#', 4), (' ', 1), ('#', 7), (' ', 5), ('#', 2), (' ', 2), ('#', 3), (' ', 6), ('#', 4), (' ', 1), ('#', 7), (' ', 3), ('#', 4), (' ', 1), ('#', 7), (' ', 5), ('#', 3), (' ', 2), ('#', 3), (' ', 5), ('#', 4), (' ', 1)], [(' ', 2), ('#', 3), (' ', 5), ('#', 3), (' ', 2), ('#', 5), (' ', 4), ('#', 4), (' ', 3), ('#', 3), (' ', 3), ('#', 4), (' ', 4), ('#', 5), (' ', 4), ('#', 4), (' ', 2), ('#', 5), (' ', 4), ('#', 4), (' ', 3), ('#', 3), (' ', 5), ('#', 3), (' ', 3), ('#', 4), (' ', 1)], [(' ', 1), ('#', 3), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 3), ('#', 3), (' ', 4), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 6), ('#', 4), (' ', 2), ('#', 4), (' ', 1)], [(' ', 1), ('#', 3), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 10), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 7), ('#', 3), (' ', 2), ('#', 4), (' ', 1)], [('#', 4), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 5), ('#', 2), (' ', 3), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 7), ('#', 3), (' ', 2), ('#', 4), (' ', 1)], [('#', 4), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 3), ('#', 10), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 14), (' ', 2), ('#', 4), (' ', 1)], [('#', 4), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 4), ('#', 4), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 12), ('#', 4), (' ', 1)], [('#', 4), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 5), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 12), ('#', 4), (' ', 1)], [(' ', 1), ('#', 3), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 5), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 12), ('#', 4), (' ', 1)], [(' ', 2), ('#', 3), (' ', 6), ('#', 2), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 4), ('#', 4), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 3), ('#', 3), (' ', 6), ('#', 2), (' ', 3), ('#', 4), (' ', 1)], [(' ', 3), ('#', 3), (' ', 4), ('#', 2), (' ', 3), ('#', 4), (' ', 5), ('#', 4), (' ', 3), ('#', 11), (' ', 3), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 4), ('#', 3), (' ', 4), ('#', 2), (' ', 4), ('#', 4), (' ', 1)], [(' ', 6), ('#', 3), (' ', 5), ('#', 6), (' ', 4), ('#', 5), (' ', 4), ('#', 2), (' ', 4), ('#', 4), (' ', 1), ('#', 6), (' ', 4), ('#', 11), (' ', 4), ('#', 5), (' ', 6), ('#', 3), (' ', 6), ('#', 6)], [(' ', 95)]]

    看到元组的第一个元素不是空格就是#,第二个元素可能是个数,尝试了下

    import pickle
    f = open('banner.p')
    
    l = pickle.load(f)
    print l
    print '
    '.join([''.join([p[0] * p[1] for p in item]) for item in l])
    
    for item in l:
        for p in item:
            s = p[0] * p[1]
    
    f.close()

    果真是一幅图

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

    坑爹!坑爹!

    下一关地址:http://www.pythonchallenge.com/pc/def/channel.html

    Level 6:

    Hint:查看页面源码,发现注释zip,可能与Zip文件有关

    将channel.html改为channel.zip,还真有zip文件;

    打开zip文件,看到有个readme.txt,内容如下:

    welcome to my zipped list.
    hint1: start from 90052
    hint2: answer is inside the zip
    发现其他文件名都是数字,于是采用zipfile模块处理文件,献上代码:

    import zipfile
    
    file_zip = zipfile.ZipFile('channel.zip')
    files = file_zip.namelist()
    def item(start):
    
        if start in files:
            with file_zip.open(start) as f:
                content = f.read()
                print content
                result = '{}.txt'.format(content.split(' ').pop())
            return item(result)
        else:
            result = start.split('.')
            print 'The result is: ', result[0]
    
    if __name__ == '__main__':
        item('90052.txt')
       

    程序最后得到:Collect the comments.

    comment??哪里来的comment,想到可能是文件的,查看到zipfile有个comment属性

    于是修改程序,收集每个文件的comment,

    import zipfile
    
    file_zip = zipfile.ZipFile('channel.zip')
    files = file_zip.namelist()
    lst = []
    def item(start):
    
        if start in files:
            with file_zip.open(start) as f:
                content = f.read()
                com = file_zip.getinfo(start).comment
                lst.append(com)
                print content
                result = '{}.txt'.format(content.split(' ').pop())
            return item(result)
        else:
            result = start.split('.')
            print 'The result is: ', result[0]
    
    if __name__ == '__main__':
        item('90052.txt')
        result = ''.join(lst)
        print result

    得到:

    ****************************************************************
    ****************************************************************
    **                                                            **
    **   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      **
    **                                                            **
    ****************************************************************
     **************************************************************

    访问:http://www.pythonchallenge.com/pc/def/hockey.html

    得到:it's in the air. look at the letters.

    还没完成,看到comments里有些字母,“OXYGEN”,将hockey改为oxygen得带下一关地址

    下一关地址:http://www.pythonchallenge.com/pc/def/oxygen.html

    持续更新

  • 相关阅读:
    asp.net pager
    asp.net 2.0
    mul page
    基于 Ajax 的持久对象映射(reship)
    asp.net run
    reship HttpProc
    some questions
    rss feed
    javascript function
    ioc
  • 原文地址:https://www.cnblogs.com/alummox/p/7309367.html
Copyright © 2011-2022 走看看