標籤:
正式開始第1關,這一關的URL的特殊部分是map。
這關的圖片上有一個本子,上面寫著K→M,O→Q,E→G,稍微思索就能發現這幾個字母都是按照字母表的順序向後移動了兩位,那麼最投機取巧的方法就是把map的3個字母按照這個規則改動就行了。雖然這個是我想要的結果,但卻並不是我想要的過程,還是得按照正規的編程方法來,而且下面還有其他的提示,姑且先全部看完。
圖片下方有一行提示:三思而後解題。再下方是幾行毫無規則的字母組合,很顯然是要通過上述規則轉化的。
對於這樣的轉換,很自然的想到的就是ASCII碼。查閱資料後,發現python中ASCII碼和字元的相互轉換使用的是ord()函數和chr()函數。然後要注意的是y和z應該是要轉換成a和b,那麼這兩個就是向前移動24位。寫好程式之後發現一個問題,由於我用來記錄轉換後內容的是一個list表,如果直接print的話不利於閱讀,繼續查閱資料後發現join()函數可以實現list到string的轉換,於是正式的代碼如下:
1 code = ‘g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. 2 bmgle gr gl zw fylb gq glcddgagclr ylb rfyrq ufw rfgq rcvr gq qm jmle. 3 sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.‘ 4 5 decode = [] 6 for i in code: 7 if ord(‘a‘) <= ord(i) <= ord(‘x‘): 8 decode.append(chr(ord(i) + 2)) 9 elif ord(‘y‘) <= ord(i) <= ord(‘z‘):10 decode.append(chr(ord(i) - 24))11 else:12 decode.append(i)13 print(‘‘.join(decode))
View Code
運行後輸出了轉換後的提示:i hope you didnt translate it by hand. thats what computers are for.doing it in by hand is inefficient and thats why this text is so long.using string.maketrans() is recommended. now apply on the url.
果然按部就班的做完還是有好處的,提示裡提到了string.maketrans()這個函數。根據python的官方文檔說明,string.maketrans(from,to)函數給translate()函數提供一個從from映射到to的翻譯表,而translate(s,table,[deletechars])函數則是從s中刪除出現在deletechars裡(如果有的話)的字元,再根據table的的規則進行轉換。
於是使用string下的maketrans()和translate()的代碼如下:
1 import string2 3 code = ‘g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp.4 bmgle gr gl zw fylb gq glcddgagclr ylb rfyrq ufw rfgq rcvr gq qm jmle.5 sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.‘6 7 print(string.translate(code, string.maketrans(‘abcdefghijklmnopqrstuvwxyz‘, ‘cdefghijklmnopqrstuvwxyzab‘)))
View Code
在第2關的左下角提示到,把URL裡的pc改成pcc可以看到前一關的各種解法。點開一看果然很多,還包括了其他語言的解法。值得一提的是,一個解法中使用string.ascii_lowercase和string.ascii_lowercase[2:] + string.ascii_lowercase[:2]的寫法代替了My Code中‘abcdefghijklmnopqrstuvwxyz‘和’cdefghijklmnopqrstuvwxyzab‘這樣看起來比較亂也容易出錯的寫法。首先,這裡的string.ascii_lowercase就是從a到z的所有小寫字母組合成的字串,當然這裡也可以寫成string.lowercase,大部分情況下兩者一樣,但是有些特殊情況後者會有變化,同理還有string.ascii_uppercase和string.uppercase。其次,這裡還用到了python中的切片,切片這個概念在看python的基本概念的時候有接觸,但並沒有機會用到,正好藉此機會鞏固一下。比如string.ascii_lowercase[2:]就是從string.ascii_lowercase[2]開始切片到字串末尾,即從‘c‘到‘z‘,而string.ascii_lowercase[:2]就是從字串開頭切片到第2位,即‘ab‘,如果有個string.ascii_lowercase[3:6],那麼就應該是‘def‘。
最後將map的翻譯寫進代碼:
1 import string2 ‘map‘.translate(string.maketrans(string.ascii_lowercase, string.ascii_lowercase[2:] + string.ascii_lowercase[:2]))
View Code
得到了進入下一關的關鍵字:ocr。
Python Challenge 過關心得(1)