學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,進入下一關。

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM