PythonChallenge Soulation (Level 1 ~ 5)

Level 1

一進去看到下面圖片的提示跟一段看不懂的文字

Level01.jpg

根據題片上面的提示,我們要做字母的移位,把每個字母偏移 2 個字母。

這個方法也是一種著名的加密方式:凱撒密碼

1
2
3
4
5
6
7
import string
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."
table = str.maketrans(string.ascii_lowercase, string.ascii_lowercase[2:] + string.ascii_lowercase[:2])
print(text.translate(table))

解開後,就可得知下一關的連結

Level 2

Level02.jpg

根據這關的提示,打開網頁原始碼可以看到下方有一堆奇怪的符號,跟著提示發現這些符號裡面藏有字母。

1
2
3
4
5
6
7
8
9
10
11
12
13
file = open('ocr.txt', 'r')
find = []
while True:
line = file.readline()
if not line:
break
else :
find += [c for c in line if c.isalpha()]
print(''.join(find))
file.close()

把網頁下載後,在從符號中找出字母就可得到答案

Level 3

Level03.jpg

圖片上面的蠟燭有大有小,其中小的蠟燭左右被三個的蠟燭所包圍,再根據提示應該是要根據這個規則找出特定的字母。一樣打開網頁原始碼,就可以看到一大堆字串。

接下來就利用 Regular Expression 來過濾出我們要的字元。

1
2
3
4
5
import re
for line in open('equality.txt'):
find = ''.join(re.findall(r"[a-z][A-Z]{3}([a-z]{1}[A-Z]{3}[a-z]", line.rstrip()))
print(find, end="")

這邊一開始我直接全部串起來用 Regular Expression 去找,出來的結果都不對。後來發現要一行一行去找才對….orz

Level 4

Level04.jpg

頁面上沒有什麼提示,但圖片有個超連結,點下去後出現 and the next nothing is 44827,觀察一下上面的網址再根據前面網頁的標題 follow the chain 跟網址 linkedlist.php,看來要寫程式跟著網址往下追。(在原始碼會發現作者說可能會需要用到 urllib module )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import re
import urllib.request
base = 'http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing={0}'
path = ['12345']
pattern = re.compile(r"[0-9]+$")
while True:
url = base.format(path[len(path) - 1]);
print(url)
page = urllib.request.urlopen(url).read().decode('UTF-8')
found = ''.join(re.findall(pattern, page))
if (found):
path.append(found)
else:
print(page)
path.append(int(path[len(path) - 1])//2)
while True:
url = base.format(path[len(path) - 1]);
page = urllib.request.urlopen(url).read().decode('UTF-8')
found = ''.join(re.findall(pattern, page))
if (found):
path.append(found)
print(url)
else:
print(page)
break;
break;

url chain 在中間的地方,會有個小變化調整一下,最後就可以得到下一關的網址

Level 5

Level05.jpg

提示給的是玩諧音的梗 XD,peack hell 唸起來像 pickle
pickle 是 Python 物件的 serialization 的模組,在根據網頁原始碼中的連結找到 serialization 後的 data 解回去,就可以得到答案

1
2
3
4
5
6
7
8
9
import pickle
with open('banner.p', 'rb') as f:
data = pickle.load(f)
for bitmap in data:
for ele in bitmap:
print(ele[0] * ele[1], end='')
print()