剛開始學python。聽師兄推薦,玩玩python challenge。
其實用各種語言都可以,但當你完成一關看別人的答案時,你會發現python有多麼的簡潔優美。
雖然很多題不會,但看了思路後,本文裡的源碼都是自己寫的。
第0關
http://www.pythonchallenge.com/pc/def/0.html
2**38
第一關
http://www.pythonchallenge.com/pc/def/274877906944.html
import string
before = list[string.ascii_lowercase ]
after = [ chr(ord(c)+2) for c in before]
after[before.index('y')] = 'a'
after[before.index('z')] = 'b'
trans = str.maketrans(''.join(before), ''.join(after))
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. """
text.translate(trans)
"map".translate(trans)
第二關
http://www.pythonchallenge.com/pc/def/ocr.html
import string
#亂碼從網頁原始碼查看最後的注釋部分複製下來
text="""..................."""
text_list = list(text)
text_real=[]
for c in text_list:
if c in string.ascii_letters:
text_real.append(c)
''.join(text_real)
第三關
http://www.pythonchallenge.com/pc/def/equality.html
現去學的python正則式,不難
text= """........"""
import re
#注意EXACTLY!
re.findall('[^A-Z][A-Z]{3}([a-z])[A-Z]{3}[^A-Z]', text)
第四關
http://www.pythonchallenge.com/pc/def/linkedlist.html
追著圖片點了兩次之後知道了……編程吧……
現學網路編程,從
http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=40961開始
中間會中斷一次……因為網頁內容變為
Yes. Divide by two and keep going.
手動輸入下一個數繼續
我第一版程式又終止在82682處,內容為
There maybe misleading numbers in the text. One example is 82683. Look only for the next nothing and the next nothing is 63579
修改到目前的版本,一直到最後
from urllib.request import urlopen
import re
template = r"http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing={0}"
number = 63579
while True:
url_file = urlopen(template.format(number))
line = list(url_file.readlines())[-1].decode()
words = line.split()
number = int(words[-1])
print(number)
第五關
http://www.pythonchallenge.com/pc/def/peak.html
查看原始碼有banner.p,一直提示peakhell……pronounce it……沒看懂
然後看了提示知道需要用pickle……
剩下的應該不難了
from urllib.request import urlopen
import pickle
banner = urlopen(r"http://www.pythonchallenge.com/pc/def/banner.p")
list_list = pickle.load(banner)
banner.close()
file = open("banner.txt","w")
buf=""
for lst in list_list:
for char, num in lst:
buf+=char*num
buf+='\n'
file.write(buf)
file.close()
很奇怪我這段代碼放在python shell裡一句一句的執行可以,寫成指令碼不能直接執行,不知道為啥……
第六關
http://www.pythonchallenge.com/pc/def/channel.html
http://www.pythonchallenge.com/pc/def/zip.html
又卡住了……再次百度
這個真是太……了,下載http://www.pythonchallenge.com/pc/def/channel.zip然後類似於第四關。
num = 90052
filename = r"channel/{0}.txt"
while True:
with open(filename.format(num)) as file:
line = file.readline()
num = int(line.split()[-1])
print(num)
最後追到collect the comments……又百度,發現要搜集zip包裡所有檔案的注釋。
現學現用,最後組成了字元畫
修改後的代碼如下:
import zipfile
zf = zipfile.ZipFile("channel.zip")
num = 90052
out = ""
while True:
line = zf.read("{0}.txt".format(num))
out += zf.getinfo("{0}.txt".format(num)).comment.decode()
# print(num)
try:
num = int(line.split()[-1])
except ValueError:
print(out)
break
第七關
http://www.pythonchallenge.com/pc/def/oxygen.html
這關一看圖片就知道密碼在圖片上,可是對映像沒任何研究……果斷百度……
代碼不粘了,直接拿答案略過,畢竟一點也不想看映像的東西。
第八關
http://www.pythonchallenge.com/pc/def/integrity.html
蜜蜂可以點,需要使用者名稱和密碼,很顯然就是網頁最後兩行un和pw,應該加密了。
果斷再百度……bz2加密
代碼超小……
import bz2
un = 'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084'
pw = 'BZh91AY&SY\x94$|\x0e\x00\x00\x00\x81\x00\x03$ \x00!\x9ah3M\x13<]\xc9\x14\xe1BBP\x91\xf08'
print bz2.decompress(un)
print bz2.decompress(pw)
python 果然漂亮
第九關
http://www.pythonchallenge.com/pc/return/good.html
圖片上的點和原始碼告訴我們,又是映像方面的問題,雖然不想,但只能百度了。
import Image, ImageDraw
img = Image.new('RGB', (640,480))
draw = ImageDraw.Draw(img)
draw.line(first)
draw.line(second)
img.show()
我對python的佩服又上了一個檔次……
最後是頭牛bull
好吧,先到這裡。
學python主要為了文本處理和小指令碼,網路方面會看看。圖形,壓縮方面真不會太關注。
有空的時候繼續吧~
第十關
http://www.pythonchallenge.com/pc/return/bull.html
規律是百度找到的,1,11,21,1211……後一個是前一個數的每一位個數+數值的組合。
a=['1']
i = 0
while i<31 :
j = 0
counter = 0
buf=""
while j < len(a[i]):
if j==0 or a[i][j] == a[i][j-1]:
counter+=1
j+=1
else:
buf += str(counter) + a[i][j-1]
counter = 1
j+=1
buf+= str(counter) + a[i][j-1]
a.append(buf)
i+=1
# print(buf)
print(len(a[30]))
看了答案後發現有個解答裡,一個小函數寫的很漂亮
def describe(s):
sets = re.findall("(1+|2+|3+)", s) # like "111", "2", ...
return= .join([str(len(x))+x[0] for x in sets])
第十一關
http://www.pythonchallenge.com/pc/return/5808.html
一看又是影像處理……略過,
密碼evil
第十二關
http://www.pythonchallenge.com/pc/return/evil.html
還是圖片,不過跟影像處理關係不大。
方法是開啟圖片檔案後,每隔5個單位存在1個檔案。得到5個圖片。
最後一個單詞沒用
dis, pro, port, ional, ity(striked out)
密碼disproportional
很奇怪這題不看別人提示怎麼做,為啥是5啊?為啥最後一個圖片還不要用?
後來百度了一下……發現這題牛逼了……有牛逼人物解答的比較詳盡
http://bochengwen.iteye.com/blog/719082
bcw104一直解答到第16關。。。
python challenge做到這越來越沒意思,我只是想練練python而已。于是之後的看看他部落格,沒興趣的跳過了。
第十三關
http://www.pythonchallenge.com/pc/return/disproportional.html
使用python的xml庫處理,沒興趣。見bcw104的部落格。
第十四關 用到影像處理
第十五關 用到日期處理函數 我現在既佩服python也佩服python challenge的作者也佩服博主……
第十六關 還是影像處理
哎……受不了了,不知道後邊還是不是影像處理,
bcw104也不更新了,我對python challenge的興趣減弱了,目前只是想用它做文本處理之類的。
以後有時間再繼續吧。