本文是pythonchallenge的33道謎題的全部提示蚁袭。
這是一個(gè)非常有趣的網(wǎng)站蒲列,強(qiáng)烈推薦有些編程基礎(chǔ)的同學(xué)嘗試鹰贵。中間參考了各路高手的解答欧募,但是沒(méi)找到一個(gè)完整的中文版本的提示,費(fèi)了一些波折鹰祸。
故特此紀(jì)錄每一關(guān)的提示甫窟,留作紀(jì)念。
我是用python來(lái)解這些謎題的蛙婴,具體代碼請(qǐng)看我的github
L0:
純熱身粗井,圖片下面的英文提示,計(jì)算圖中的數(shù)字的十進(jìn)制x敬锐,url最后換成x.html
L1:
從圖片上看背传,是凱撒密碼,解密方法為所有字母右移兩個(gè)字母台夺。
用此方法解密圖片下面的亂碼径玖,得到提示。對(duì)url使用同樣的方法颤介。
L2:
檢查網(wǎng)頁(yè)的源代碼梳星,注釋里有一個(gè)很長(zhǎng)的字符串,找出這堆字符中所有的英文字母滚朵,得到下一關(guān)的地址冤灾。
L3:
和前一關(guān)類(lèi)似,根據(jù)提示辕近,從注釋的字符串里韵吨,找出左右兩邊各有且僅有3個(gè)大寫(xiě)字母的小寫(xiě)字母。
L4:
是一個(gè)php頁(yè)面移宅,根據(jù)源碼里面的注釋?zhuān)琻othing的值從12345開(kāi)始归粉,迭代打開(kāi)下一個(gè)頁(yè)面幾百次之后,得到下一關(guān)的地址漏峰。(中間會(huì)有一次提示糠悼,把當(dāng)前值減半再繼續(xù)迭代)
L5:
提示“peak hell”念起來(lái)像什么。浅乔。(這個(gè)得對(duì)python的庫(kù)很熟)
把banner.p文件包含的亂碼用pickle模塊讀取倔喂,得到下一關(guān)的地址。
L6:
注釋提示“zip”,下載channel.zip文件席噩,解壓得到一堆數(shù)字名的文件和一個(gè)readme班缰。readme里兩個(gè)提示,一是要從90052文件開(kāi)始班挖,做類(lèi)似L4的事情鲁捏。另一個(gè)說(shuō)答案在zip里(和沒(méi)說(shuō)一樣)芯砸。萧芙。原來(lái)每一個(gè)數(shù)字文件在zip的comment里是有內(nèi)容的,這些注釋連起來(lái)得到個(gè)單詞假丧。打開(kāi)這個(gè)頁(yè)面双揪,又提示:it's in the air. look at the letters。包帚。原來(lái)前面的單詞的每一個(gè)字母是由不同的小字符組成的渔期。。連起來(lái)進(jìn)入下一關(guān)渴邦。
L7:
圖片中間有一條灰度色塊很奇怪疯趟,信息就藏在這些色塊的灰度值里。按照7個(gè)像素的間隔谋梭,取中間條線的灰度值信峻,轉(zhuǎn)成ascii碼,得到提示瓮床№镂瑁“聰明的小伙啊,下一關(guān)是[105, 110, 116, 101, 103, 114, 105, 116, 121]”隘庄,再轉(zhuǎn)一遍ascii碼踢步,搞定。
L8:
點(diǎn)圖中蜜蜂要求輸入用戶名密碼丑掺。
網(wǎng)頁(yè)源碼里的提示非常直接:用戶名和密碼都是bzip2格式壓縮過(guò)的获印。
L9:
標(biāo)題提示把點(diǎn)連起來(lái)。
注釋里面有first和second兩個(gè)數(shù)組街州。每個(gè)數(shù)組代表畫(huà)的一部分兼丰。把數(shù)組里的數(shù)字兩兩分組,每組代表一個(gè)點(diǎn)的橫豎坐標(biāo)菇肃。連起來(lái)發(fā)現(xiàn)是頭牛地粪,而且是公牛。
L10:
點(diǎn)牛的圖片跳出一個(gè)數(shù)組來(lái):1, 11, 21, 1211, 111221,,,(找不到規(guī)律可以去這個(gè)棒棒的網(wǎng)站查)
按照標(biāo)題的提示琐谤,算出這個(gè)數(shù)組的第30個(gè)值的長(zhǎng)度蟆技。
L11:
標(biāo)題提示“奇偶”,看圖片貌似有很多黑黑白白的點(diǎn)。仔細(xì)觀察(google提示)像素點(diǎn)的值质礼,發(fā)現(xiàn)偶數(shù)行0旺聚,2,4...的點(diǎn)接近黑色眶蕉,奇數(shù)行1砰粹,3,5...的點(diǎn)接近黑色造挽。分離出這些點(diǎn)做出一張新圖碱璃,黑色的圖片上有淺淺的紅色字母。
L12:
圖片是在分牌饭入,看源碼注意到圖片名字后加了個(gè)1嵌器。試驗(yàn)改成2,3谐丢,4爽航。圖片2提示要把jpg換成gfx。下載下來(lái)后不知道gfx是個(gè)什么鬼乾忱〖フ洌看二進(jìn)制源碼,有一些“PIP”窄瘟,“NFN”衷佃,“G8G”之類(lèi)的片段,推測(cè)出“PNG”寞肖。觀察這些字符的間隔都是5纲酗,所以把gfx文件拆分成5個(gè)圖片文件。(分牌的提示)每張圖片有幾個(gè)字母新蟆,連起來(lái)進(jìn)入下一關(guān)觅赊。(mac上預(yù)覽第四張圖片顯示全黑,用chrome打開(kāi)正常顯示)
這里有個(gè)點(diǎn)容易漏掉琼稻,evil4.jpg存在但根本不是一張圖片吮螺,按文本打開(kāi)得到下一關(guān)要用到的提示(Bert是魔鬼)
L13:
文字提示要打電話給魔鬼,點(diǎn)圖片中間的5會(huì)跳到一個(gè)php頁(yè)面帕翻,一個(gè)XML文件提示錯(cuò)誤的code鸠补。這里有個(gè)神奇的協(xié)議叫XML-RPC,listMethods查這個(gè)頁(yè)面的接口嘀掸,有一個(gè)叫“phone”的方法紫岩,打給“Bert”就進(jìn)入下一關(guān)。
L14:
標(biāo)題提示繞圈走睬塌,注釋有100100 = (100+99+99+98) + (... 泉蝌,下面有一張?jiān)幃惖膱D片歇万,下載發(fā)現(xiàn)大小為100001。猜測(cè)應(yīng)該要把這張圖重組成100*100的勋陪。結(jié)合提示贪磺,應(yīng)該是像蚊香那樣一圈圈的轉(zhuǎn)起來(lái)。得到新圖片發(fā)現(xiàn)是只貓诅愚,進(jìn)入網(wǎng)頁(yè)發(fā)現(xiàn)貓的名字是下一關(guān)寒锚。
L15:
標(biāo)題提示猜一個(gè)人,圖片顯示是1**6年的1月26日违孝。右下角顯示二月份有29天刹前,結(jié)合1月1日是星期四,找到所有可能的年份等浊。注釋里面提示不是最近的那一年腮郊,而是離現(xiàn)在第二近的那一個(gè)答案摹蘑。注釋里面第二個(gè)提示筹燕,明天買(mǎi)鮮花,暗示是1月27日衅鹿,google一下那個(gè)日期撒踪,得到答案。
L16:
標(biāo)題提示“讓我來(lái)把這些排直了”大渤。圖片中有很多個(gè)小粉條制妄,仔細(xì)觀察后發(fā)現(xiàn),每一行有且僅有一個(gè)粉條泵三。把每一行的像素點(diǎn)水平滾動(dòng)耕捞,使得小粉條都移動(dòng)到最左邊,得到的新圖片烫幕,顯示答案俺抽。
L17:
感覺(jué)是33關(guān)里謎題最復(fù)雜的一關(guān)
圖片提示要看cookie。左下角的圖片是第四關(guān)的圖片较曼。
回到第四關(guān)的頁(yè)面磷斧,cookie提示“you+should+have+followed+busynothing...
”。(注意這里的‘+’號(hào)捷犹,也是一個(gè)小提示)
按照L4的做法弛饭,再跑一遍busynothing,把每一頁(yè)的cookie連起來(lái)萍歉÷滤蹋看著是bz2壓縮過(guò)的字符串。而且還是URL-quoted過(guò)的枪孩。unquote 并且把中間的“+”換成空格符之后憔晒,bz2解壓胳蛮,得到新的提示:給他老爸發(fā)消息 “the flowers are on their way”。
回到L15的接口丛晌,設(shè)置cookie仅炊,phone莫扎特老爸,終于得到下一關(guān)的提示澎蛛。(最后一個(gè)單詞)
L18:
標(biāo)題提示“說(shuō)出兩張圖的差別”抚垄,怕你不懂,注釋還加了句“比你想象的更明顯”谋逻。(亮度brightness不同)
真正的L18呆馁,下載“deltas.gz”,gzip解壓之后毁兆,發(fā)現(xiàn)是個(gè)很大的文本浙滤。文本每一行分成左右兩部分,前面的幾行左右兩邊都是一樣的气堕,但后面但行會(huì)出現(xiàn)不一致纺腊。而且第一行開(kāi)頭的幾個(gè)數(shù)字,轉(zhuǎn)成ascii碼就是字母png茎芭。說(shuō)明左右兩部分都代表圖片揖膜。
回想前面的提示“說(shuō)出兩張圖的差別”。
把整個(gè)文本分成三部分梅桩,左右共有的部分壹粟,左邊獨(dú)有的部分,右邊獨(dú)有的部分宿百。三部分各自構(gòu)成一張png圖片趁仙。分別是下一關(guān)的url,用戶名和密碼垦页。
L19:
網(wǎng)頁(yè)的注釋里面包含了一個(gè)base64壓縮的wav文件雀费,解壓之后發(fā)現(xiàn)說(shuō)的是sorry。但前后有些噪音外臂。
觀察幀數(shù)據(jù)發(fā)現(xiàn)有很多重復(fù)出現(xiàn)的字節(jié)坐儿。采樣頻率減為一半之后得到一個(gè)新的wav文件,里面說(shuō)了idiot宋光。進(jìn)入這個(gè)頁(yè)面會(huì)提示"Now you should apologize..."(暗示回郵件)貌矿,點(diǎn)next到下一關(guān)。
回郵件“sorry”給 leopold.moz@pythonchallenge.com罪佳,會(huì)得到回復(fù)逛漫。。里面有一個(gè)md5碼赘艳,這在L26會(huì)用到
L20:
這關(guān)也很難
提示“but inspecting it carefully is allowed.” 還是不懂酌毡。
關(guān)鍵在于http response的header里面克握,有一個(gè)字段
('content-range', 'bytes 0-30202/2123456789'),看起來(lái)很奇怪枷踏。
請(qǐng)求的時(shí)候設(shè)置'content-range'為30203會(huì)得到新的range和信息菩暗。
反復(fù)設(shè)置'content-range'為新的range+1,得到一系列信息旭蠕。
然后倒過(guò)來(lái)停团,設(shè)置range為2123456789,也能得到一系列信息掏熬。
最終能得到一個(gè)zip文件的字符串佑稠,解壓密碼在前面的一堆信息里。(把給你的名字反轉(zhuǎn)過(guò)來(lái))
解壓zip包后旗芬,readme說(shuō)舌胶,這就是L21了。
L21:
readme 提示疮丛,做完后看看挺對(duì)路:
- 小時(shí)候經(jīng)常玩這個(gè)游戲
- 沒(méi)想法的時(shí)候幔嫂,就往回看看
另一個(gè)package是一個(gè)zlib壓縮文件,解開(kāi)之后還是zlib壓縮文件这刷,反復(fù)解壓之后變成一個(gè)bzip壓縮文件婉烟,繼續(xù)擼起袖子干(建議還是code搞定),最終得到一堆亂碼暇屋。。洞辣。
仔細(xì)觀察咐刨,亂碼倒過(guò)來(lái)還是個(gè)zlib文件。好了繼續(xù)擼扬霜,最終解壓完得到一句話“l(fā)ook at your logs”定鸟。
好吧,回頭把前面的每一次解壓過(guò)程用一個(gè)字母標(biāo)記著瓶,每次倒序的地方就換行联予,得到一個(gè)文本文件。一看就知道下一關(guān)來(lái)了材原。
L22:
提示“white.gif”要更亮一點(diǎn)沸久。。
明明看上去是全黑的余蟹。而且這么簡(jiǎn)單的圖有40多k卷胯。
仔細(xì)觀察,發(fā)現(xiàn)這個(gè)gif有133幀威酒,每幀有一個(gè)點(diǎn)的顏色不是純黑窑睁。這個(gè)點(diǎn)都離中心點(diǎn)(100挺峡,100)不遠(yuǎn)。(點(diǎn)距離中心的偏移量担钮,就是這一步的步長(zhǎng))
結(jié)合圖片橱赠,游戲搖桿的提示。這和很早之前的海龜畫(huà)圖方法很像箫津。從中心點(diǎn)開(kāi)始畫(huà)圖病线,下一個(gè)點(diǎn)和之前的點(diǎn)用直線連接,一步步畫(huà)出一個(gè)字母的圖形鲤嫡。如果這個(gè)點(diǎn)是(100送挑,100),就代表一個(gè)字母寫(xiě)完了暖眼,開(kāi)始下一個(gè)字母惕耕。
畫(huà)完圖,記得加亮那個(gè)灰色的點(diǎn)诫肠,進(jìn)入下一關(guān)司澎。
L23:
提示'va gur snpr bs jung?',用L1的方法解密栋豫,得到提示“in the face of what?”挤安,這是python zen里的一句。
L24:
走迷宮丧鸯,注意一點(diǎn)蛤铜,白色是墻,黑色是路丛肢。
走完發(fā)現(xiàn)路徑很繞围肥,仔細(xì)觀察發(fā)現(xiàn)路徑上每一個(gè)點(diǎn)的r值都不一樣,連起來(lái)轉(zhuǎn)ascii碼蜂怎,發(fā)現(xiàn)是zip格式穆刻。解壓后,圖片上有下一關(guān)的url杠步。
另一個(gè)mybroken.zip后面有用氢伟。
L25:
標(biāo)題提示:想象他們聽(tīng)起來(lái)怎樣
注釋提示:你能看見(jiàn)waves嗎?
發(fā)現(xiàn)有l(wèi)ake1.wav到lake25.wav這25個(gè)文件幽歼。下載聽(tīng)了之后發(fā)現(xiàn)都是噪音朵锣。檢查這些圖片的幀率是9600,一共10800幀试躏。很詭異猪勇。
仔細(xì)觀察原來(lái)這些都是披著wav皮的PNG文件。
每一個(gè)wav文件可以轉(zhuǎn)成一個(gè)6060的rgb格式的png颠蕴。(60603=10800)
然后把這25個(gè)png按照55的拼圖拼起來(lái)泣刹,進(jìn)入下一關(guān)
L26:
提示:像個(gè)男人一樣道歉/你收到郵件了
找到L19的回信助析,“Can you believe what one mistake can lead to?”
L24里面的mybroken.zip有一個(gè)字符錯(cuò)了。
按照郵件里面的md5碼椅您,修復(fù)這個(gè)zip包外冀,解壓后得到圖片,顯示“speed”掀泳,結(jié)合提示“Hurry up, I'm missing the boat”雪隧, 進(jìn)入下一關(guān)。
L27:
有鏈接到28關(guān)员舵,但是需要密碼
標(biāo)題:在tables之間
注釋?zhuān)哼@不是重復(fù)L14(廢話)
下載gif文件脑沿,PIL顯示圖片模式是“P”,即8位彩色模式马僻,但圖片看上去是灰色的庄拇。(檢查圖片的palette發(fā)現(xiàn)RGB值都是一樣的。)有點(diǎn)奇怪韭邓。
將圖片轉(zhuǎn)成“L”模式措近,即灰度模式,然后比較兩張圖片的數(shù)據(jù)女淑,發(fā)現(xiàn)“P”圖除了第一個(gè)點(diǎn)之外瞭郑,和“L”圖的數(shù)據(jù)大部分都是一樣的。
提取這兩張圖數(shù)據(jù)不同之處鸭你,發(fā)現(xiàn)“P”圖獨(dú)有的部分屈张,是bz2加密的字符串,解壓后得到很多重復(fù)的單詞苇本。
額外的提示袜茧,將兩張圖相同/不同的點(diǎn),轉(zhuǎn)成“1”模式瓣窄,即黑白圖。得到的圖片提示:“not key word, busy?”
從這些單詞中去除python的關(guān)鍵字纳鼎,最后剩兩個(gè)單詞俺夕,即用戶名和密碼。
L28:
提示:大聲念Ring-Ring-Ring
好吧贱鄙,是Green劝贸。
標(biāo)題提示:many pairs ring-ring
(圖片是挺綠的)看來(lái)是要比較圖片中的G值了。把G值兩兩配對(duì)相減逗宁,差取絕對(duì)值映九,發(fā)現(xiàn)大部分都是42.(為什么是42)過(guò)濾掉所有42后轉(zhuǎn)成ascii碼,得到新提示'whodunnit().split()[0] ?'
就是python作者的名字的首個(gè)單詞了瞎颗。
L29:
圖片名字提示:這是誰(shuí)
如果你總是從瀏覽器里直接看源碼件甥,很可能會(huì)錯(cuò)過(guò)這關(guān)的提示捌议。
網(wǎng)頁(yè)源碼最后藏了很多長(zhǎng)長(zhǎng)短短的空格。引有。
把空格的個(gè)數(shù)連起來(lái)轉(zhuǎn)bytes瓣颅,得到答案
L30:
下載csv文件,仔細(xì)觀察發(fā)現(xiàn)csv文件的數(shù)字譬正,每個(gè)都在0到1之間宫补,且一共有139*53個(gè)數(shù)字。用這些數(shù)字生成一張灰色圖片曾我,每個(gè)數(shù)字乘256作為這個(gè)點(diǎn)的灰度值粉怕。
圖片顯示了一個(gè)公式,把這些數(shù)字按照公式提示的規(guī)則抒巢,生成一個(gè)新的數(shù)字串贫贝,轉(zhuǎn)成ascii碼,得到答案虐秦。
L31:
網(wǎng)上查找這張圖片平酿,它的位置是kohsamui, thailand。也就是需要的用戶名悦陋,密碼蜈彼。
真正的31關(guān)來(lái)了,圖片名字是mandelbrot俺驶,google發(fā)現(xiàn)是分形的圖幸逆。仔細(xì)研究下如何構(gòu)造mandelbrot集,用圖片上提供的坐標(biāo)系暮现,自己生成一張圖片还绘。肉眼看和網(wǎng)頁(yè)上的圖一樣,比較每一個(gè)像素點(diǎn)發(fā)現(xiàn)栖袋,兩張略有差異拍顷。
把所有不同的點(diǎn)的差值記錄下來(lái),長(zhǎng)度是23*73塘幅。用這些值生成一張黑白圖昔案。(大于0的點(diǎn)為黑色,小于0的點(diǎn)為白色)
網(wǎng)上查找這張圖片电媳,又漲姿勢(shì)了踏揣。
L32:
快結(jié)束了,好開(kāi)心匾乓。
這關(guān)是個(gè)有趣的游戲捞稿,橫豎的數(shù)組,代表了這行/列的格子的情況。
先做warmup.txt娱局,解完之后做up.txt彰亥。
up解完能夠看到一個(gè)熟悉的logo。
進(jìn)入url之后铃辖,得到新的提示:"Free" as in "Free speech", not as in "free...
google這段話進(jìn)入下一關(guān)
這是這系列里面最難的一個(gè)算法了剩愧,得費(fèi)些心思
L33:
提示:
If you are blinded by the light,
remove its power, with its might.
Then from the ashes, fair and square,
another truth at you will glare.
做到這里,看見(jiàn)圖片名字后面有數(shù)字娇斩,自然而然就會(huì)改改試試了仁卷。
下載png圖片,根據(jù)上面那段有些詩(shī)意的提示犬第,把png里面高于特定亮度值的點(diǎn)去掉锦积,剩余點(diǎn)個(gè)數(shù)如是個(gè)平方數(shù),就能生成一張新圖片出來(lái)歉嗓。
嘗試所有亮度閾值之后丰介,得到一系列有字母的圖片。
把那些被包在方形框里的字母連起來(lái)
恭喜通關(guān)
通關(guān)這些練習(xí)你一定學(xué)到了很多python的知識(shí)鉴分,更會(huì)發(fā)現(xiàn)一個(gè)小破網(wǎng)頁(yè)原來(lái)還能有那么多藏東西的地方哮幢。。