python challenge 答案詳解 1

2021-06-23 01:51:53 字數 3985 閱讀 1073

很想學好python,看到乙個教程說下面這個**很有意思,於是就過去咯。

這裡主要還是抱著學習的心態給出答案,因此涉及到的函式都會做乙個了解。

第0關:

就是2的38次方,計算後把結果替換到位址列裡就好了。

>>> 2**38

274877906944

第1關:

這是乙個解謎遊戲。

給出了替換的提示,可以很簡單的看出來,密文就是明文後移兩個字母。

因此用python解密:

import string

>>>

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

>>>

>>> transfun=string.maketrans('abcdefghijklmnopqrstuvwxyz','cdefghijklmnopqrstuvwxyzab')

>>> print str.translate(transfun)

>>> print 'map'.translate(transfun)

ocr

其中maketrans函式用來做乙個替換的對映。然後對目標字串使用這個對映translate得到明文。最後按提示將轉換應用在url上得到下一步的**。

第2關:

按照提示,檢視網頁源**,最下面是一大堆亂碼,我們要從中獲取自己的資訊。

因此將亂碼複製到檔案中,命名為「2.tmp」,然後利用正規表示式從中提取字母。

import re

f=open('2.tmp','r')

str=f.read()

res=re.findall(r"[a-za-z]", str)

print ''.join(res)

findall函式返回的總是正規表示式在字串中所有匹配結果的列表。

第3關:

提示意思是小蠟燭兩邊都有三個大蠟燭。

於是檢視網頁原始碼,那一堆亂碼中要找出乙個小寫字母兩邊被連續三個大寫字母夾住的部分。

前面的部分和上面相同,只是正規表示式變了。

res=re.findall(r"[^a-z][a-z]([a-z])[a-z][^a-z]", str)

print ''.join(res)

這裡表示以大寫字母開頭和結尾,且有且僅有3個大寫字母。   第一次可能沒有考慮全面(比如我!)會把a aaasaaa a這種算進去。

第4關:

把linkedlist.php複製到位址列跳轉過去後,又要檢視源**。

可以看到,就是讓你不斷地跳轉頁面,可以設定乙個正則判斷,直到不出現next跳出。

import urllib

import re

urlbase = 'pc/def/linkedlist.php?nothing='

num = '25357'

while(1):

content = urllib.urlopen(urlbase+num).read()

match = re.search('and the next nothing is (\d+)',content)

if(match != none):

num = match.group(1)

print num

else:

break

中間會有幾次停下來,可以進入到最後print的num網頁裡檢視資訊,按它要求操作,然後修改num繼續執行。

第5關:

這一關挺奇怪的...

大概就是這個叫peakhell,讀音類似於pickle,因此是用pickle模組來處理src中的banna.p檔案

然後會得到乙個列表,由多個裝滿了(word,count)鍵值對的小列表組成,

import cpickle as pickle

#我把它儲存到123裡了,其實可以直接用urllib開啟的

object = pickle.load(open("123"))

for item in object:

print "".join(map(lambda p: p[0]*p[1], item))

在python中,無論是變數還是函式,都是乙個物件。當python執行時,物件儲存在記憶體中,隨時等待系統的呼叫。然而,記憶體裡的資料會隨著計算機關機和消失,pickle可以將物件儲存到檔案,並儲存在硬碟上。

可以pickle所有python支援的 原生型別 : 布林, 整數, 浮點數, 複數, 字串, bytes(位元組串)物件, 位元組陣列, 以及 none.由任何原生型別組成的列表,元組,字典和集合。由任何原生型別組成的列表,元組,字典和集合組成的列表,元組,字典和集合(可以一直巢狀下去,直至python支援的最大遞迴層數).函式,類,和類的例項(帶警告)。例子:

# _*_ coding = utf-8 _*_

import pickle

#序列化

def dump_pickle():

user={}

user['id']=1

user['name']='tanweijie'

user['email']='[email protected]'

user['***']='boy'

#with保證自動關閉檔案

#設定檔案模式為'wb'來以二進位制寫模式開啟檔案

with open('c:/users/mr_tank_/desktop/user.pickle','wb') as f:

#dump()函式接受乙個可序列化的python資料結構

pickle.dump(user,f)

print('success')

#反序列化

def load_pickle():

with open('c:/users/mr_tank_/desktop/user.pickle','rb') as f:

user=pickle.load(f)

#user變數是乙個字典

print(user)

第6關:

但是這裡有一點可能很多人不理解,最後乙個檔案寫著「collect  the  comment」,讓人摸不到頭腦。但其實,每乙個壓縮檔案都有乙個檔案資訊叫做注釋,linux下的歸檔管理器是看不到的,windows下的強大的壓縮工具可以看到..

好在python有封裝好的函式可以讀取他們~

import zipfile,re

z=zipfile.zipfile('channel.zip','r')

value=90052

findnothing = re.compile(r'(?<=next nothing is )\d+').search

comments=

while true:

content=z.read('%s.txt'%value)

match=findnothing(content)

if match:

value=match.group(0)

else:

break

print content

print z.read('%s.txt'%value)

print ''.join(comments)

現就這樣0.0

pythonchallenge 闖關遊戲

level 4 此關有點抽象,開啟page source,檢視用綠色字型標註的部分,會發現提示所用模組 urllib,prompt 如下 import urllib,re url desnum 12345 for i in range 400 content urllib.urlopen url d...

pythonchallenge之C 學習篇 02

第二關任然是乙個字元處理的關卡 檢視網頁原始碼發現有一大串字元需要處理,這麼多的字元如果放在源 裡就很不好了 所以要用到c 對檔案的操作,用到的標頭檔案是fstream 這裡參照了這個博文 對檔案處理上來說要對立面的字串進行字元型別判斷,對單個字元型別的判斷 比如說屬於字母還是數字 要用到一寫字符操...

pythonchallenge之C 學習篇 01

字元處理時每個語言都具備的一種功能,其中還有一些語言因此出名,比如perl,shell,還有一些函式式的程式語言 c語言中的字串與陣列和指標聯絡的比較緊密,因此可以這樣生命字串 p hello wybret c 還定義了乙個內容豐富的抽象資料型別標準庫,其中重要的型別就是string和vector以...