PythonChallenge闯关详解

article/2025/9/12 16:58:30

前言
PythonChallenge是国外的一位工程师设计的一套编程闯关游戏,网址:PythonChallenge,每一关都可以用一段Python程序解决问题得到下一关的入口,本博文作为一个学习笔记,通过边学边记的方式分享我的闯关经验。

0 图片上是2 38的字样,下方提示为改变当前URL地址,很明显,用Python脚本计算下2的38次方,替换下URL中的0就可以了

2**38

得到274877906944,那么下一关地址:
http://www.pythonchallenge.com/pc/def/274877906944.html

1 仍然是一幅图,标记K->M O->Q E->G,下方有一串字母,看不出什么意思,很明显,这是让你解密,按照图片中的提示,将字母向后移动两位即可,注意y要对应a,z对应b,这样逻辑才能完整。刚开始用的是最原始的方法解题,解出来后作者推荐用maketrans的方法,试了下更好用。

import sys
from string import maketrans
str = "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."
intab = "abcdefghijklmnopqrstuvwxyz"
outab = "cdefghijklmnopqrstuvwxyzab"
transtab = maketrans(intab,outab)
print str.translate(transtab)
print "map".translate(transtab)

将网址中的“map”应用这种转换得到“ocr”,这就是下一关的入口了。

2 提示:识别字符,可能在书里,可能在页面源码里,果断F12,查看网页源码,在网页源码的注释中,提示找到出现次数最少的字符,有一大串字符,数数是肯定不行的,考虑用程序解决。

str = "balabalabala..."
cnt = {}    # 用于保存字符出现的总次数
list = []   # 用于保存字符首次出现的先后顺序
for i in str:if i in cnt:cnt[i] += 1else:cnt[i] = 1list.append(i)
print cnt
print list

次数出现最少的是几个字母,只出现了一次,按照出现的先后顺序,拼成“equality”, 这就是下一关的入口了。

3 提示里直接翻译字面意思:找到这样的小写字母,它的两侧都被确定的三个大写字母包围。那么要在哪里找呢?按照上一关的经验, 我们再打开网页源码,仍然看到了一大串的字符;那么应用正则表达式匹配可以快速地找到符合条件的字母。

import re
str = "balabala..."
pattern = re.compile(r'[^A-Z][A-Z]{3}[a-z][A-Z]{3}[^A-Z]')
res = pattern.findall(str)
print(res)

最后找到的字母组合起来是:linkedlist,这就是下一关的入口了。

4 这一关作者使用了PHP,一开始只有一幅图片,没有其他任何提示,不过当点击图片的时候跳转到了另一个网页,只有一句话“and the next nothing is 44827”,那么把44827放到URL中的nothing中,又开始了跳转,还是只有一句话“and the next nothing is 45439”,这个五位数应该是下一个跳转的入口。我们总不能手动一个一个地跳转,别忘了我们的初衷,用python来自动地访问网页,不断提取下一个入口的钥匙,最终应该能找到下一关的入口,这个应该是作者的意图了。
在实际运行的过程中,作者设置了一些障碍:
a. 除以2,网页内容是“Divede by two and keep going”,这个时候要特殊处理下
b. misleading number,内容中出现误导数字,注意要严格匹配“the nothing is”后边的数字

import requests
import re
import time
url = "http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing="
key = "90990"
pattern = r'and the next nothing is ([0-9]+)'
while True:print(url + key)curtext = requests.get(url + key).textprint(curtext)if "Divide by two" in curtext:   # handle "Divide by two"key = str(int(key)/2)continueif "and the next nothing" not in curtext:breakkey = re.search(pattern,curtext).group(1)

最后一个匹配的数字66831,这个时候网页内容是“peak.html”,这是下一关的入口了。

5 这一关仍是一副图片,提示为“pronounce it”, 没看懂,然后打开网页源码,有一个banner.p的网址,打开后一堆字符,然后提示“peak hell sounds familiar?”,恩,还是没懂。果断百度,查到peak hell是谐音python的一个pickle标准库,呃。。。我真的不知道这个库是干啥用的,果断再百度,原来这个库是用来序列化和反序列化的,赶脚类似于加解密一样的,贴一个比较有帮助的博客pickle学习
那么我们应该要做的是反序列化,看看真实内容是什么,反序列化的内容当然是那个banner.p的内容了。
反序列之后得到的是一个list,每个元素还是一个list,再向下的元素就是元组了,得到了这些还是不知道下一关入口在哪里,再去百度,原来每个元组的第一个元素是一个字符,第二个元素是数字,就是这个字符重复了多少次,问题到这里就比较清楚了,把这些打印出来就是了,代码如下:

import pickle
f = open("./123",'r')
bb = pickle.load(f)
f.close
print bb
for line in bb:print(''.join(x[0]*x[1] for x in line))

打印的结果是
打印结果
下一关的入口就是channel了

6 这一关的图片是一幅拉链的图,下边是一个paypal的按钮,打开网页源码,上边注释里zip的提示,下边注释的一大段话的意思是作者请求对这个项目捐赠的内容,跟本题无关,也就是说,那个paypal的按钮是真的会跳转到付款页面的。。。
也就是说,有用的提示就是zip,zip也是拉链的意思,那么把url里的channel改成zip会怎样呢,是一段话“yes,find the zip.”,然后就没有然后了;
再把html改成zip呢,咦,会下载一个channel.zip的文件,解压缩后,里边有N多个txt文件,还有一个readme,每个txt的内容似曾相识,“Next nothing is XXXXX”,readme里有两个提示:一个是起始数字是90052,另一个是答案在zip里,那么,问题就很清楚了,通过不断地循环读取文件,直到找到下一关入口,跟第4关类似,不同的是,登网页改成读文件了。

import re
dirpath = "./channel/"
curnum = "90052"
pattern = r'Next nothing is ([0-9]+)'
while True:filepath = dirpath + curnum + ".txt"print filepathf = open(filepath,'r')content = f.read()cursch = re.search(pattern,content)f.closeif cursch == None:print contentbreakelse:curnum = cursch.group(1)

最后打开的文件是46145.txt,内容是“Collect the comments.”。嗯,这个也没懂什么意思,去百度了下,原来zip压缩文件都有一个注释,而这个注释可以通过python的zipfile取出来,那么我们再按照刚来检索文件的顺序,取每个文件的Comment,并收集打印出来,就是。。。
在这里插入图片描述
那么入口是hockey。。。吗? 输入hockey后,页面有一段话“it’s in the air. look at the letters.”,提示我们注意看字幕,那么下一关的入口就是oxygen了


http://chatgpt.dhexx.cn/article/VnEZ7SR0.shtml

相关文章

scanf返回值被忽略问题

解决Visual Studio中scanf返回值被忽略问题 最近在使用Visual Studio编写c语言时遇到了scanf返回值被忽略问题 总结了如下几种解决方法: 方法一(不建议) scanf修改成 scanf_s 可以说scanf_s是vs编译器特有的,它认为scanf不安全&…

scanf库函数的返回值

目录 一背景: 二 scanf返回值规则 1.在格式字符串为用%d的情况下 (1)输入5 6此时scanf能正确读入的数据为两个,返回值为2 scanf正确读入概念补充 (2)如果输入5 t此时能正确读入的数据为1个,返回值为1。 (3)如果输入1 2.5 (4)输入t 5&a…

scanf的返回值被忽略

scanf的返回值被忽略 在编译器VS2019和VS2022中,在使用scanf函数时会报错,具体错误scanf的返回值被忽略。 解决办法 方法一 可以直接将scanf改成scanf_s,因为编译器觉得scanf_s这是比较安全的函数。 方法二 我们可以关闭VS2019和VS2022编译器的安全检查…

scanf返回值被忽略的办法

1、右击项目,点击属性 2、在预处理定义中输入_CRT_SECURE_NO_WARNINGS,点击确认 需要注意的是如果再创建了一个项目需要重新再设置一次哦!或者把sanf改为scanf_s也可以哦。

为什么VS/VsStudio当中警告返回值被忽略“scanf” ?VsStudio中scanf返回值被忽略的原因及其解决方法

警告原因:Vs 认为 scanf 函数不安全 所以提示警告⚠ 解决方案一: 只需将 scanf() 替换为 scanf_s() 原因:scanf_s 是 VsStudio自己定义的函数 功能和 scanf() 类似, 所以不会有警告 优点: 正常运行不会再有警告 …

VS2022中scanf返回值被忽略的原因及其解决方法

额 产生原因: scanf()函数在读取时不检查边界,所以可能会造成内存泄漏。有一定的安全隐患。 此时会提醒你把scanf换为scanf_s;BUT,scanf_s是VS特有的函数,写了之后在别的编译器上就无法执行,使得代码的可移…

scanf返回值

转载于:https://www.cnblogs.com/fairy-wzp/p/6926244.html

两个办法轻松解决VS中”scanf返回值被忽略“问题

出现原因: 在ANSI C中只有scanf(),没有scanf_s(),但是scanf()在读取时不检查边界(忽略检查返回值),所以可能会造成内存泄漏,于是Microsoft公司在VS编译器中提供了scanf_s()(注意只有…

【C语言入门】VS编译器:scanf返回值被忽略

一、发现问题 学习C语言中使用VS编译器,期间使用scanf函数会遇到报错警告:返回值被忽略:"scanf"的情况。 二、分析问题 这个问题是因为scanf不检查边界,会引起内存泄露,造成安全隐患。虽然微软VS编译器中…

解决“scanf返回值被忽略”一劳永逸的方法

首先我们需要下载一个软件:Notepad 然后在VS的安装路径中找到一个文件:newcfile.cpp 我的路径是上面那个,可能不同人的路径不一样,可以在搜索栏中直接搜索。 鼠标右击,点开红圈里的Notepad 来到一个界面,把…

VS2019:scanf返回值被忽略

一、问题再现 如下是笔者在学习数据结构中的二叉树时遇到的问题: 报错警告:返回值被忽略:"scanf"。 二、问题分析 百度一下之后大致原因是:scanf()函数在读取时不检查边界,所以可能会造成内存泄漏。有一定…

scanf返回值被忽略的原因及其解决方法(vs2019)

在使用Visual Studio 2019编写C语言程序时相信大家都遇见了scanf返回值被忽略这个问题 存在的问题就是scanf函数输入不安全,其实在vs编译器环境下,这种不安全的函数有很多。 为了解决这个问题,编译器给了三种方法 方法①: 是用…

解决Visual Studio中scanf返回值被忽略问题

昨天在使用Visual Studio 2022编写C语言程序时遇到了scanf返回值被忽略问题 Vs2022中scanf返回值被忽略原因是:scanf ()函数在读取时不检查边界,所以可能会造成内存泄漏,有一定的安全隐患。 总结了如下几种解决方法: 方法一 scan…

scanf返回值被忽略的原因及其解决方法

昨天在使用Visual Studio 2019编写C语言程序时遇到了scanf返回值被忽略问题 因为我也是刚开始使用VS2019学习C语言,第一次遇到这种问题,也不知道怎么回事,然后就上Chrome研究了一番,才知道原因,并且找到了几种分散在个…

VsStudio中scanf返回值被忽略的原因及其解决方法

相信有不少人在使用vs的时候会遇到以下这个问题:scanf返回值被忽略,接下来我就告诉大家该如何解决这个问题 出现问题的原因: 因为scanf()在读取数据时不检查边界,所以可能会造成内存泄漏。Microsoft公司觉得这个函数不安全&#x…

VS2022 scanf返回值被忽略怎么办

scanf返回值被忽略怎么办,掌握了这个办法后,就再也不会有这个苦恼啦。 先在vs的安装路径里找到:newcfile.cpp文件,然后点击鼠标右键找到文件所在位置。 找到文件所在的位置后将该文件复制粘贴到桌面上然后在桌面将文件打开进行修…

浅谈scanf()函数的返回值

浅谈scanf()函数的返回值 1.scanf()函数的返回值为int类型 2.当为scanf(%d,&a); scanf(%c,&b); 等类型时,当输入值是有效的时候,返回值为1 3.当为scanf("%d%d%d",&c,&x,&v); 等类型时,当三个输入值是有效值时…

贪心算法小结

目录 贪心算法 例题 活动安排问题 背包问题 删数问题 多处最优服务次序 贪心算法 在求最优解问题的过程中,依据某种贪心标准,从问题的初始状态出发,直接去求每一步的最优解,通过若干次的贪心选择,最终得出整个问…

贪心算法模板及详解

一、.活动选择问题 二、钱币找零问题 三、再论背包问题 四、多机调度问题 五、小船过河问题 六、区间覆盖问题 七、销售比赛问题 八、Huffman编码 九、Dijkstra算法 十、最小生成树算法 贪心算法的定义 贪心算法是指在对问题求解时,总是做出在当前看来是最…

贪心算法例题

贪心算法经典例题解析 贪心法:遵循某种规律,不断贪心的选取当前最优策略的算法设计方法。 例一:分糖果 已知一些孩子和一些糖果,每个孩子有需求因子g,每个糖果有大小s,当某个糖果的大小s > 某个孩子的需…