鱼C论坛

 找回密码
 立即注册
查看: 13980|回复: 117

[技术交流] python小练习(000): Python Challenge解密游戏

[复制链接]
发表于 2016-11-2 21:17:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 jerryxjr1220 于 2017-2-17 17:29 编辑

Python Challenge是一个网页闯关游戏,通过一些提示找出下一关的网页地址,总共有33关。

通过这些练习,可以提高我们python的编程水平。

它是专门为程序员设计的,因为大多数关卡都要编程来算哦!!

算法可以用python,当然也能用其他语言。

这个是起始网页:http://www.pythonchallenge.com/pc/def/0.html


                               
登录/注册后可看大图


比如,这个热身关,线索就是2的38次方,然后用python算一下得出结果。

那么下一关的网址就是用计算出的结果替换起始页网址中的‘0’,以此类推。

欢迎有兴趣的鱼油一起闯关,可以在这里交流下心得

经过100多帖的更新,终于完成了全部33关,当然其中有些关卡还是参考了网上其他的提示,总体来说,难度还是蛮大的。其中对pillow模块和Requests模块的训练,对我的帮助还是挺大的。

同时也感谢所以关注本贴的鱼油,更新完毕!

梳理一下,我所闯过的关卡所运用的python知识点(非常有趣的关卡,我用**标记出来,不断更新中):
**        第一关:        asc码变换: chr和ord函数
        第二关:        词频统计:collections.Counter
        第三关:        正则表达式
        第四关:        爬虫+正则
        第五关:        pickle模块
        第六关:        Zip模块+正则
**        第七关:        pillow模块: RGB值提取
        第八关:        bz2加密模块
        第九关:        pillow模块: 画图
        第十关:        动态规划算法
**        第11关:        pillow模块:图像拆分
        第12关:        文件拆分
        第13关:        xmlrpclib模块(仅支持python2)
**        第14关:        pillow模块:回型图片复原
**        第15关:        datetime模块:日期检索
**        第16关:        pillow模块:错位图像复原
        第17关:        cookie模块,bz2加密模块,xmlrpclib模块
**        第18关:        difflib模块:分离文件或字符串中相同和不同的部分
        第19关:        base64模块:邮件形式加密,wave模块:帧的提取与写入
**        第20关:        requests模块: 浏览器头部信息模拟和服务器头部信息访问
        第21关:        zlib模块和bz2模块
        第22关:        pillow模块:gif图像帧数据读取
**        第23关:        this模块:了解python理念
**     第24关:  迷宫解法,pillow模块:像素提取
        第25关:        pillow模块:图片写入和复原拼接,wav模块:帧的提取
        第26关:  hashlib模块:md5验证,破损文件修复
        第27关:        pillow模块:调色板信息
        第28关:        pillow模块:RGB3通道分离
        第29关:        无
        第30关:        csv信息读取,pillow模块:图像信息转换,图像识别
        第31关:        pillow模块:图像信息转换,mandelbrot图像构造,图像识别:arecibo信息
        第32关:    游戏关卡,未想到方法破解
        第33关:    pillow模块,图像信息提取

评分

参与人数 2荣誉 +6 鱼币 +6 贡献 +4 收起 理由
清风明月星 + 1 + 1 + 1 鱼C有你更精彩^_^
suxinmi + 5 + 5 + 3 楼主收下我的漆盖吧

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-11-3 13:13:58 | 显示全部楼层
根据上文的提示,通过python的计算2**38,得到274877906944,替代url中的0,得到进入下一关的url。
然后就跳转到正式的第一关:
1.JPG

后面准备依次记录下所有解谜的过程,欢迎有兴趣的鱼油一起讨论。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-3 13:44:23 | 显示全部楼层
根据上图的提示,猜测应该是字符位移加密,即每个字符的asc码值+2.
然后设计程序:
  1. string = "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."
  2. ''' Tips: K -> M, O -> Q, E -> G'''
  3. replace1 = ''.join([chr(ord(i)+2) for i in string])
复制代码

根据输出进行优化,添加了下列代码:
  1. replace2 = replace1.replace('"',' ').replace('{','a').replace('|','b').replace('0','.')
  2. print (replace2)
复制代码


输出:
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也进行相同的操作。
当前页面的url 是map,于是就有了。
  1. url = 'map'
  2. print (''.join([chr(ord(i)+2) for i in url]))
复制代码


输出:
ocr

顺利进入下一关
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-3 13:52:14 | 显示全部楼层
jerryxjr1220 发表于 2016-11-3 13:44
根据上图的提示,猜测应该是字符位移加密,即每个字符的asc码值+2.
然后设计程序:

只对字母进行位移操作,maketrans后面的括号应该保留。
  1. str1 = "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."
  2. str2 = ""
  3. for c in str1:
  4.     if 96 < ord(c) <123:
  5.         str2 += chr(((ord(c) - 95) % 26) + 97)
  6.     else:
  7.         str2 += c
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-3 13:54:02 | 显示全部楼层

                               
登录/注册后可看大图

进入以后有如下提示:
recognize the characters. maybe they are in the book,
but MAYBE they are in the page source.

让我们到源代码里面去找线索。
于是打开浏览器的源代码浏览,结果。。。
  1. <!--
  2. find rare characters in the mess below:
  3. -->

  4. <!--
  5. %%$@_$^__#)^)&!_+]!*@&^}@[@%]()%+[(_@%+%$*^@$^!+]!&_#)_*}{}}!}_]$[%}@[{_@#_^{*
  6. @##&{#&{&)*%(]{{([*}@[@&]+!!*{)!}{%+{))])[!^})+)$]#{*+^((@^@}$[**^{$!@#$%)!@(&
  7. +^!{%_@^!}$_${)$_#)!({@!)(^}!*^&!$%_&&}&_#&@{)]{+)%*{&*%*&@%$+]!*__(#!*){%&@++
  8. !_)^&%#+)}!@!)&^}**#!_$([$!$}#*^}$+&#[{*{}{((#$]{[$[$()_#}!@}^@_&%^*!){*^^_$^
  9. 。。。
  10. 。。。
  11. 。。。
复制代码

在一大堆字符里面要找到出现最少的字符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-3 14:12:22 | 显示全部楼层
既然要统计出现次数最少的词,那么就用到了词频统计的方法。
  1. from collections import Counter
  2. c = Counter(data)
  3. print (c)
复制代码

输出:
Counter({')': 6186, '@': 6157, '(': 6154, ']': 6152, '#': 6115, '_': 6112, '[': 6108, '}': 6105, '%': 6104, '!': 6079, '+': 6066, '$': 6046, '{': 6046, '&': 6043, '*': 6034, '^': 6030, '\n': 1221, 'a': 1, 'e': 1, 'i': 1, 'l': 1, 'q': 1, 'u': 1, 't': 1, 'y': 1})
可以看到a,e,i,l,q,u,t,y都只出现了1次,那么应该就是这几个字母组成的,然后就要研究下排列秩序了。

然后就想到了昨天做的一个关于字母排序的程序(还有感谢版主大大的程序优化@冬雪雪冬
于是就有了:
  1. with open('lemmas.txt') as f:
  2.     dic = [i.strip('\n') for i in f]
  3. dics ={}
  4. for each in dic:
  5.         if len(each) not in dics:
  6.                 dics[len(each)] = [each]
  7.         else:
  8.                 dics[len(each)].append(each)

  9. def words(letters):
  10.         word = []
  11.         for potword in dics[len(letters)]:
  12.                 if sorted(letters) == sorted(potword):
  13.                         word.append(potword)
  14.         return word

  15. print ("'aeilquty' ==>", words('aeilquty'))
复制代码


输出:
("'aeilquty' ==>", ['equality'])

于是,找到了进入下一关的url
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2016-11-3 14:15:07 | 显示全部楼层
感觉这个python的技巧挑战非常有趣,所用到的解题方法也非常实用,帮助我们熟悉python的各种常用功能,如果能全部完成这33个关卡的话,会对我们的编程能力有很大的提高。
强烈推荐!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-3 14:32:07 | 显示全部楼层
冬雪雪冬 发表于 2016-11-3 13:52
只对字母进行位移操作,maketrans后面的括号应该保留。

嗯,你写得比较严谨,我是对着输出边做边改的,自己能看懂就没有去优化了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-3 15:34:14 | 显示全部楼层
接着来,进入第3关

                               
登录/注册后可看大图

提示是:
One small letter, surrounded by EXACTLY three big bodyguards on each of its sides.

一开始以为是要找这样的:
xXXXx
xXxXx
xXXXx
或者这样的:
        X
        X
        X
xXXXxXXXx
        X
        X
        X
找了一大圈,都没有结果。
后来google了一下规则,好吧,人家要找这样的:xXXXxXXXx
这对于正则表达式不是就一句话么:
  1. import re
  2. print ''.join(re.findall('[a-z][A-Z]{3}([a-z])[A-Z]{3}[a-z]', data))
复制代码


输出:
linkedlist

进入下一关
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-11-3 15:43:35 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2016-11-3 15:46 编辑

第四关:http://www.pythonchallenge.com/pc/def/linkedlist.php

                               
登录/注册后可看大图

这关的线索是:Follow the chain
然后每点一次图片,就给一个5位数的数字,然后跳转到下个页面。
很明显这就要我们运用python的爬虫,不断爬取所有数字,直到到达终点。
果然这个挑战,训练我们方方面面的python技能啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-11-3 20:06:46 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2016-11-3 20:08 编辑

用正则抓取url
  1. import requests
  2. import re
  3. url = 'http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing='
  4. number = 8022
  5. res = requests.get(url+str(number))
  6. try:
  7.         while True:
  8.                 number = re.findall(r'\d{3,},res.text)[0]
  9.                 print (number)
  10.                 res = requests.get(url+number)
  11. except:
  12.         print (res.text)
复制代码


经过几百个网页的跳转之后,终于找到了下一关的线索:
peak.html
[Finished in 151.8s]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-3 20:11:29 | 显示全部楼层
来到第5关:

                               
登录/注册后可看大图


提示:peak hell, pronounce it
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-3 20:17:51 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2016-11-3 20:46 编辑

查看源代码发现可以下载一个banner.p的文件,而且peak hell读起来有点像pickle,那应该是用pickle来读取这个文件了。
  1. import pickle
  2. f = open('banner.p','rb')
  3. what = pickle.load(f)
  4. print (what)
复制代码


输出:
[[(' ', 95)], [(' ', 14), ('#', 5), (' ', 70), ('#', 5), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 6), ('#', 3), (' ', 6), ('#', 4), (' ', 3), ('#', 3), (' ', 9), ('#', 3), (' ', 7), ('#', 5), (' ', 3), ('#', 3), (' ', 4), ('#', 5), (' ', 3), ('#', 3), (' ', 10), ('#', 3), (' ', 7), ('#', 4), (' ', 1)], [(' ', 3), ('#', 3), (' ', 3), ('#', 2), (' ', 4), ('#', 4), (' ', 1), ('#', 7), (' ', 5), ('#', 2), (' ', 2), ('#', 3), (' ', 6), ('#', 4), (' ', 1), ('#', 7), (' ', 3), ('#', 4), (' ', 1), ('#', 7), (' ', 5), ('#', 3), (' ', 2), ('#', 3), (' ', 5), ('#', 4), (' ', 1)], [(' ', 2), ('#', 3), (' ', 5), ('#', 3), (' ', 2), ('#', 5), (' ', 4), ('#', 4), (' ', 3), ('#', 3), (' ', 3), ('#', 4), (' ', 4), ('#', 5), (' ', 4), ('#', 4), (' ', 2), ('#', 5), (' ', 4), ('#', 4), (' ', 3), ('#', 3), (' ', 5), ('#', 3), (' ', 3), ('#', 4), (' ', 1)], [(' ', 1), ('#', 3), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 3), ('#', 3), (' ', 4), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 6), ('#', 4), (' ', 2), ('#', 4), (' ', 1)], [(' ', 1), ('#', 3), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 10), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 7), ('#', 3), (' ', 2), ('#', 4), (' ', 1)], [('#', 4), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 5), ('#', 2), (' ', 3), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 7), ('#', 3), (' ', 2), ('#', 4), (' ', 1)], [('#', 4), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 3), ('#', 10), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 14), (' ', 2), ('#', 4), (' ', 1)], [('#', 4), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 4), ('#', 4), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 12), ('#', 4), (' ', 1)], [('#', 4), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 5), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 12), ('#', 4), (' ', 1)], [(' ', 1), ('#', 3), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 5), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 12), ('#', 4), (' ', 1)], [(' ', 2), ('#', 3), (' ', 6), ('#', 2), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 4), ('#', 4), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 3), ('#', 3), (' ', 6), ('#', 2), (' ', 3), ('#', 4), (' ', 1)], [(' ', 3), ('#', 3), (' ', 4), ('#', 2), (' ', 3), ('#', 4), (' ', 5), ('#', 4), (' ', 3), ('#', 11), (' ', 3), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 4), ('#', 3), (' ', 4), ('#', 2), (' ', 4), ('#', 4), (' ', 1)], [(' ', 6), ('#', 3), (' ', 5), ('#', 6), (' ', 4), ('#', 5), (' ', 4), ('#', 2), (' ', 4), ('#', 4), (' ', 1), ('#', 6), (' ', 4), ('#', 11), (' ', 4), ('#', 5), (' ', 6), ('#', 3), (' ', 6), ('#', 6)], [(' ', 95)]]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-3 20:48:21 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2016-11-3 20:57 编辑

从这个表来看,应该能拼出一幅画出来。
想想应该怎么实现。
  1. for each in what:
  2.     print (''.join([e[0]*e[1] for e in each]))
复制代码


输出的字符画,还挺漂亮的。

  1.               #####                                                                      #####
  2.                ####                                                                       ####
  3.                ####                                                                       ####
  4.                ####                                                                       ####
  5.                ####                                                                       ####
  6.                ####                                                                       ####
  7.                ####                                                                       ####
  8.                ####                                                                       ####
  9.       ###      ####   ###         ###       #####   ###    #####   ###          ###       ####
  10.    ###   ##    #### #######     ##  ###      #### #######   #### #######     ###  ###     ####
  11.   ###     ###  #####    ####   ###   ####    #####    ####  #####    ####   ###     ###   ####
  12. ###           ####     ####   ###    ###    ####     ####  ####     ####  ###      ####  ####
  13. ###           ####     ####          ###    ####     ####  ####     ####  ###       ###  ####
  14. ####           ####     ####     ##   ###    ####     ####  ####     #### ####       ###  ####
  15. ####           ####     ####   ##########    ####     ####  ####     #### ##############  ####
  16. ####           ####     ####  ###    ####    ####     ####  ####     #### ####            ####
  17. ####           ####     #### ####     ###    ####     ####  ####     #### ####            ####
  18. ###           ####     #### ####     ###    ####     ####  ####     ####  ###            ####
  19.   ###      ##  ####     ####  ###    ####    ####     ####  ####     ####   ###      ##   ####
  20.    ###    ##   ####     ####   ###########   ####     ####  ####     ####    ###    ##    ####
  21.       ###     ######    #####    ##    #### ######    ###########    #####      ###      ######
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-4 11:20:06 | 显示全部楼层
后面来到第6关

                               
登录/注册后可看大图

看到这个图片,就知道肯定和zip文件有关。
果然在网页源代码中,找到了线索“<html> <!-- <-- zip -->”
把网址的html替换成zip就能下载到一个zip文件。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-4 11:28:13 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2016-11-4 11:36 编辑

打开zip文件,看到有几千个文本文档,然后找到readme,要求我们从90052.txt开始往下找线索,原理还是和之前爬网页的原理一样,只不过这里要运用zipfile的模块+正则。
  1. #!/usr/bin/python
  2. # -*- coding: UTF-8 -*-
  3. import zipfile
  4. import re
  5. channel = zipfile.ZipFile('channel.zip','r')
  6. name = '90052'
  7. try:
  8.         while True:
  9.                 filename = name+'.txt'
  10.                 f = channel.open(filename,'r')
  11.                 string = f.read()
  12.                 f.close()
  13.                 name = re.findall('\d{2,},string)[0]
  14.                 print name
  15. except:
  16.         print string
复制代码


最后输出:
Collect the comments.

好吧,原理这些文本文件中还包含有comments

继续收集comments
  1. import zipfile
  2. import re
  3. channel = zipfile.ZipFile('channel.zip','r')
  4. comments = []
  5. name = '90052'
  6. try:
  7.         while True:
  8.                 filename = name+'.txt'
  9.                 f = channel.open(filename,'r')
  10.                 string = f.read()
  11.                 comments.append(channel.getinfo(filename).comment)
  12.                 f.close()
  13.                 name = re.findall('\d{2,},string)[0]
  14.                 print name
  15. except:
  16.         print string
  17. print comments
复制代码

输出:
['*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '\n', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '\n', '*', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '*', '*', '\n', '*', '*', ' ', ' ', ' ', 'O', 'O', ' ', ' ', ' ', ' ', 'O', 'O', ' ', ' ', ' ', ' ', 'X', 'X', ' ', ' ', ' ', ' ', ' ', ' ', 'Y', 'Y', 'Y', 'Y', ' ', ' ', ' ', ' ', 'G', 'G', ' ', ' ', ' ', ' ', 'G', 'G', ' ', ' ', 'E', 'E', 'E', 'E', 'E', 'E', ' ', 'N', 'N', ' ', ' ', ' ', ' ', ' ', ' ', 'N', 'N', ' ', ' ', '*', '*', '\n', '*', '*', ' ', ' ', ' ', 'O', 'O', ' ', ' ', ' ', ' ', 'O', 'O', ' ', ' ', 'X', 'X', 'X', 'X', 'X', 'X', ' ', ' ', ' ', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', ' ', ' ', ' ', 'G', 'G', ' ', ' ', ' ', 'G', 'G', ' ', ' ', ' ', 'E', 'E', 'E', 'E', 'E', 'E', ' ', ' ', 'N', 'N', ' ', ' ', ' ', ' ', 'N', 'N', ' ', ' ', ' ', '*', '*', '\n', '*', '*', ' ', ' ', ' ', 'O', 'O', ' ', ' ', ' ', ' ', 'O', 'O', ' ', 'X', 'X', 'X', ' ', ' ', 'X', 'X', 'X', ' ', 'Y', 'Y', 'Y', ' ', ' ', ' ', 'Y', 'Y', ' ', ' ', 'G', 'G', ' ', 'G', 'G', ' ', ' ', ' ', ' ', ' ', 'E', 'E', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'N', 'N', ' ', ' ', 'N', 'N', ' ', ' ', ' ', ' ', '*', '*', '\n', '*', '*', ' ', ' ', ' ', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', ' ', 'X', 'X', ' ', ' ', ' ', ' ', 'X', 'X', ' ', 'Y', 'Y', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'G', 'G', 'G', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'E', 'E', 'E', 'E', 'E', ' ', ' ', ' ', ' ', ' ', 'N', 'N', 'N', 'N', ' ', ' ', ' ', ' ', ' ', '*', '*', '\n', '*', '*', ' ', ' ', ' ', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', ' ', 'X', 'X', ' ', ' ', ' ', ' ', 'X', 'X', ' ', 'Y', 'Y', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'G', 'G', 'G', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'E', 'E', 'E', 'E', 'E', ' ', ' ', ' ', ' ', ' ', ' ', 'N', 'N', ' ', ' ', ' ', ' ', ' ', ' ', '*', '*', '\n', '*', '*', ' ', ' ', ' ', 'O', 'O', ' ', ' ', ' ', ' ', 'O', 'O', ' ', 'X', 'X', 'X', ' ', ' ', 'X', 'X', 'X', ' ', 'Y', 'Y', 'Y', ' ', ' ', ' ', 'Y', 'Y', ' ', ' ', 'G', 'G', ' ', 'G', 'G', ' ', ' ', ' ', ' ', ' ', 'E', 'E', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'N', 'N', ' ', ' ', ' ', ' ', ' ', ' ', '*', '*', '\n', '*', '*', ' ', ' ', ' ', 'O', 'O', ' ', ' ', ' ', ' ', 'O', 'O', ' ', ' ', 'X', 'X', 'X', 'X', 'X', 'X', ' ', ' ', ' ', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', ' ', ' ', ' ', 'G', 'G', ' ', ' ', ' ', 'G', 'G', ' ', ' ', ' ', 'E', 'E', 'E', 'E', 'E', 'E', ' ', ' ', ' ', ' ', ' ', 'N', 'N', ' ', ' ', ' ', ' ', ' ', ' ', '*', '*', '\n', '*', '*', ' ', ' ', ' ', 'O', 'O', ' ', ' ', ' ', ' ', 'O', 'O', ' ', ' ', ' ', ' ', 'X', 'X', ' ', ' ', ' ', ' ', ' ', ' ', 'Y', 'Y', 'Y', 'Y', ' ', ' ', ' ', ' ', 'G', 'G', ' ', ' ', ' ', ' ', 'G', 'G', ' ', ' ', 'E', 'E', 'E', 'E', 'E', 'E', ' ', ' ', ' ', ' ', ' ', 'N', 'N', ' ', ' ', ' ', ' ', ' ', ' ', '*', '*', '\n', '*', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '*', '*', '\n', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '\n', ' ', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '\n']
估计又是一副字符画了。。。

再来:
把最后一句改成:
  1. print ''.join(comments)
复制代码

然后就看到:
  1. ****************************************************************
  2. ****************************************************************
  3. **                                                            **
  4. **   OO    OO    XX      YYYY    GG    GG  EEEEEE NN      NN  **
  5. **   OO    OO  XXXXXX   YYYYYY   GG   GG   EEEEEE  NN    NN   **
  6. **   OO    OO XXX  XXX YYY   YY  GG GG     EE       NN  NN    **
  7. **   OOOOOOOO XX    XX YY        GGG       EEEEE     NNNN     **
  8. **   OOOOOOOO XX    XX YY        GGG       EEEEE      NN      **
  9. **   OO    OO XXX  XXX YYY   YY  GG GG     EE         NN      **
  10. **   OO    OO  XXXXXX   YYYYYY   GG   GG   EEEEEE     NN      **
  11. **   OO    OO    XX      YYYY    GG    GG  EEEEEE     NN      **
  12. **                                                            **
  13. ****************************************************************
  14. **************************************************************
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-4 11:58:34 | 显示全部楼层
上一关还没结束,把hockey输入url后,得到一个提示(应该是字谜):
it's in the air. look at the letters.

它在空气中,看字母。。。
后来想到应该是O2,氧气在空气中,look中的oo正好包含这个字母。
然后我试了o2,但是结果不正确,试了英文oxygen(氧气),然后就到第7关了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-4 12:02:03 | 显示全部楼层
第7关只有一张图片,啥提示都没有。不过这个图片很奇怪,中间有一条线,可能和这条线有关,暂时还没想出来。

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-4 15:32:45 | 显示全部楼层
不错不错!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-4 16:54:02 | 显示全部楼层
第7关解开了,用到的方法是用pillow提取那条灰色线条,然后通过RGB分离,转化为asc码
提取RGB:(y值只要42到50就可以了,中间一条,其实每个色块只要1个点就行了)
  1. #!/usr/bin/python
  2. # -*- coding: UTF-8 -*-
  3. from PIL import Image
  4. import codecs
  5. f = codecs.open('RGB.txt','a')
  6. pic = Image.open('oxygen.png','r')
  7. pix = pic.load()
  8. width = pic.size[0]
  9. height = pic.size[1]
  10. pixes = []
  11. for x in range(width):
  12.     for y in range(42,50):
  13.         r,g,b,a = pix[x,y]
  14.         f.writelines(str((r,g,b,a))+'\n')
  15. f.close()
复制代码

然后得到RGB的txt文档
打开文档,看到色块的RGB值都是相同的,然后提取RGB值,转化为asc码
  1. import re
  2. record = []
  3. f=open('RGB.txt','r')
  4. con = f.read().split('\n')
  5. f.close()
  6. for each in con:
  7.     try:
  8.         e = each.strip('(').strip(')').split(', ')
  9.         print e
  10.         if e[0] == e[1] == e[2]:
  11.             record.append(chr(int(e[0])))
  12.     except:
  13.         continue
复制代码

看record的输出,发现每49个字符都是重复的,然后去掉重复的字符,加代码:
  1. print ''.join([record[i] for i in range(len(record)) if i % 49 == 5])
复制代码


输出:
smart guy, you made it. the next level is [105, 110, 116, 101, 103, 114, 105, 116, 121]

哈哈,胜利在望了,把后面这串数字再转asc码
  1. print ''.join([chr(105),chr(110),chr(116),chr(101),chr(103),chr(114),chr(105),chr(116),chr(121)])
复制代码

第7关的通关密码:
integrity
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 22:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表