Pythonchallenge一起来闯关(二)

前情提要:Pythonchallenge一起来闯关(一)

这一篇来闯关10-15.感觉这几关比先前的难了不少,有的题目完全没思路.

10.

页面源码中的链接点击后有a = [1, 11, 21, 1211, 111221,

google之后知道这是一个叫做http://en.wikipedia.org/wiki/Look-and-say_sequence的数列.下面是一种比较简洁的解法.

import re

x="1"
for each in range(5):
    print(x)
    l = re.findall(r"(\d)(\1*)", x)
    print(l)
    x="".join([str(len(i+j))+i for i,j in re.findall(r"(\d)(\1*)", x)])

    #re.findall()返回一个元祖的list,元祖的元素个数为表达式中group的个数
    #re中\number表示匹配group(number)匹配到的内容,比如说(\d)(\1)如果(\d)匹配的是2,那么这里的\1则要匹配数字2
    #如果(\d)匹配到的是1,那么这里的\1则要匹配数字1

    #print(x)

print(len(x))

注意一下正则表达式中\number的意思.我看完文档后写了好几个例子才搞清楚是什么意思.

>>> re.findall(r‘(\d)(\w)\1‘,"1a1234")

[(‘1‘, ‘a‘)]

>>> re.findall(r‘(\d)(\w)\1‘,"2a1234")

[]

>>> re.findall(r‘(\d)(\w+)\1‘,"2a1234")

[(‘2‘, ‘a1‘)]

11.

根据提示 “odd even"猜想取出坐标(x,y)一个为奇数一个为偶数的像素点.按这个思路写完之后发现不对,换个思路,将原图中坐标(x,y)一个为奇数一个为偶数的像素点去除(将该点像素设成黑色(0,0,0)).得到答案。

import urllib.request as ur
from PIL import Image

def main():
    #需要用户名密码访问url
    url = "http://www.pythonchallenge.com/pc/return/cave.jpg"
    username = ‘huge‘
    password = ‘file‘
    p = ur.HTTPPasswordMgrWithDefaultRealm()
    p.add_password(None, url, username, password)
    handler = ur.HTTPBasicAuthHandler(p)
    opener = ur.build_opener(handler)
    ur.install_opener(opener)

    dataBytes = ur.urlopen(url).read()
    f = open("11_cave.jpg","wb")
    f.write(dataBytes)

    im = Image.open("11_cave.jpg")
    w,h = im.size
    mode = im.mode
    bands = im.getbands()
    print(w,h)
    print(type(mode),mode)
    print(type(bands),bands)

    #imAnswer = Image.new(mode,(w,h),(255,255,255))      

    for i in range(w):
        for j in range(h):
            if (i + j)%2 == 1:
                pos = (i,j)
                im.putpixel(pos,0)

    im.save(‘11answer.jpg‘)

if __name__ == ‘__main__‘:
    main()

12.

完全没有思路的一道题.搜索之后知道是有5张图片,二进制的数据被写到了一个叫做evil2.gfx的文件中,需要像挨个发牌一样一字节一字节的重新"发回到"5个图片文件....

太考验发散思维了...

import urllib.request as ur

def main():
    #需要用户名密码访问url
    url = "http://www.pythonchallenge.com/pc/return/evil2.gfx"
    username = ‘huge‘
    password = ‘file‘
    p = ur.HTTPPasswordMgrWithDefaultRealm()
    p.add_password(None, url, username, password)
    handler = ur.HTTPBasicAuthHandler(p)
    opener = ur.build_opener(handler)
    ur.install_opener(opener)

    dataBytes = ur.urlopen(url).read()
    f = open("12_evil2.gfx","wb")
    f.write(dataBytes)

    print(len(dataBytes))
    types = [‘jpg‘,‘png‘,‘gif‘,‘png‘,‘jpg‘]
    for i in range(5):
        imagedata = dataBytes[i::5]
        image = open(‘12answer_%d.%s‘ % (i,types[i]),‘wb‘)
        image.write(imagedata)

if __name__ == ‘__main__‘:
    main()

执行代码后,有5张图片,前面4张字母连起来就是答案.用二进制的方式打开图片文件.可以看到.jpg文件的首字节0xff,.png文件的首字节为0x89,猜测应该是首字节或者是前几字节

代表图片的格式的字段,没有去深究.

13

页面源码中有一个链接指向phonebook.php,点击进入以后出现提示:This XML file does not appear to have any style information associated with it. The document tree is shown below.google之后知道是少了某些描述文件,可以简单理解为类似于html中缺少了css,所以浏览器就无法正常展示格式吧.然而还是不知道要如何继续下去,去标准库中查找xml相关的内容,还是没啥思路.继续google页面中的节点名称<methodResponse>,找到了xmlrpc---xml远程调用,到这里问题就简单了.代码如下:

import xmlrpc.client

def main():
    x = xmlrpc.client.ServerProxy("http://www.pythonchallenge.com/pc/phonebook.php")
    print(x.system.listMethods())
    print(x.phone(‘Bert‘))

if __name__ == ‘__main__‘:
    main()

XML-RPC is a Remote Procedure Call method that uses XML passed via HTTP as a transport. With it, a client can call methods with parameters on a remote server (the server is named by a URI) and get back structured data.类似于webservice,server端实现了一些功能,并提供一些接口给客户端使用.

14.

这一题没啥思路,google了之后知道是要将下面的那个size为10000*1的条形码像上面的那个便便一样的面包一样不断旋转,最终得到一个100*100的

图.有了思路之后就好办了,我的代码如下:

import urllib.request as ur
from PIL import Image

l = [[i, i-1, i-1, i-2] for i in range(100, 0, -2)]
#print(l)

def main():
    im = Image.open("wire.png")
    #print(im.size)
    (width,height) = im.size
    mode = im.mode
    #pos = [(x,y) in range(width,height)]
    #print(pos)
    #print(width,height)
    #print(im.getpixel((639,486)))

    x,y=0,0
    imAnswer = Image.new(mode,(100,100),(255,255,255))
    #print(imAnswer.size)
    #左上角为坐标(0,0),左下角为坐标(0,99),右上角坐标为(99,0),右下角坐标为(99,99)
    #im.getpixel((i,0))
    #imAnswer.putpixel((0,0),(255,0,0))
    #imAnswer.putpixel((99,0),(0,255,0))
    #imAnswer.putpixel((0,99),(0,0,255))
    #imAnswer.putpixel((99,99),(255,255,255))
    #imAnswer.save(‘14Answer.jpg‘)

    lastPos=(-1,0) #上一个坐标位置
    maxStep=100 #当前最多走到多少步需要变向
    currentSteps=0 #当前方向已经走了多少步
    currentDirection=1 #1:向右,2:向下,3:向左,4向上

    for i in range(0,10000):
        pixel = im.getpixel((i,0))

        if currentDirection == 1:
            pos = (lastPos[0] + 1,lastPos[1])
        if currentDirection == 2:
            pos = (lastPos[0],lastPos[1] + 1)
            print(lastPos,pos)
        if currentDirection == 3:
            pos = (lastPos[0] - 1,lastPos[1])
        if currentDirection == 4:
            pos = (lastPos[0],lastPos[1] - 1)

        #print(currentDirection,lastPos,pos)

        try:
            imAnswer.putpixel(pos,pixel)
        except:
            pass
            #print(pos)

        #更新点的位置信息
        lastPos = pos

        currentSteps += 1

        #处理到达边界的情况
        if (currentSteps == maxStep):
            if currentDirection == 1:
                currentDirection = 2
                currentSteps = 0
                maxStep -= 1
                #print("turn to down!",currentDirection)
            elif currentDirection == 2:
                currentDirection = 3
                currentSteps = 0
            elif currentDirection == 3:
                currentDirection = 4
                currentSteps = 0
                maxStep -= 1
            elif currentDirection == 4:
                currentDirection = 1
                currentSteps = 0

    imAnswer.save(‘14Answer.jpg‘)

if __name__ == ‘__main__‘:
    main()

执行完后得到一张猫的图片,输入http://www.pythonchallenge.com/pc/return/cat.html得到提示:and its name is uzi. you‘ll hear from him later.把cat换成uzi即是下一关地址.

15.

这一题比较简单

标题是whom?图片是一个日历.应该是找出某个日期的某个人.图片中右下角的图仔细看可以看到2月29日,说明是闰年.

import calendar
from datetime import date

yearlist = []
for x in range(0,10):
    for y in range(0,10):
        year = 1000 + x*100 + y*10 + 6
        if calendar.isleap(year):
            yearlist.append(year)
#print(yearlist)

for year in yearlist:
    d = date(year,1,1)
    if d.weekday() == 3:   #周一到周日:0-6
        print(year)
#第二年轻的,是1756年.google 1756年1月26日 第二天是莫扎特诞生
时间: 2024-10-29 19:06:32

Pythonchallenge一起来闯关(二)的相关文章

光棍节程序员闯关秀(总共10关)

程序员闯关大挑战: https://1111.segmentfault.com/ 仓鼠演示7k7k.4399小游戏: http://cdn.abowman.com/widgets/hamster/hamster.swf 第一关 提示: 从所有信息中找到进入下一关的方法 这一关很简单,即使没有任何web知识也能轻松通过.只要你懂得晃鼠标~~ 查看源代码会发现有这么一行: <p><astyle="color: #172024"href="?k=7a2546077

网页闯关游戏(riddle webgame)--SQL注入的潘多拉魔盒

前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. web开发初学者往往会忽视一些常见的漏洞, 比如SQL注入攻击, XSS攻击. 本文将简述SQL注入攻击的原理, 并分享下关卡设计, 其在打开潘多拉魔盒的情况下, 又能很好地限制危害. 效果展示: 先打下广告: 网页闯关游戏入口(请狠狠地点击我, ^_^). 本文的想法实施于第十一关--健忘的教授. 很直接的呈现一个登陆对话框, 考验玩家

射击闯关游戏,旧王已死、新王当立?

射击类游戏的最佳形态是电子竞技?比如<穿越火线> 街机.单机时代的<魂斗罗>.<合金装备>等闯关型射击游戏体验,不再适合移动手游时代? 射击类游戏需要更真实.更热血,最好如昆丁塔伦蒂洛的电影一样,拳拳到肉.血浆横飞?比如<使命召唤>? 曾经占据游戏机.单机和联机游戏极大份额的射击游戏们,在移动时代只能扮演有益补充? 射击类游戏混的似乎不太好?不是没有缘故的,根本原因就是长期自由搏击,而忘记了,其实关卡才是最能吸引用户的所在? 关卡.关卡.关卡!你还在自由搏击

闯关模式配置

一,数据库新建一个闯关NPC,运行下面命令即可 insert into `creature_template` (`entry`, `difficulty_entry_1`, `difficulty_entry_2`, `difficulty_entry_3`, `KillCredit1`, `KillCredit2`, `modelid1`, `modelid2`, `modelid3`, `modelid4`, `name`, `subname`, `IconName`, `gossip_m

THEPYTHONCHALLENG闯关记录

由于是自己看视频学python,总觉得不写几行代码就什么都没有学到. 找了一个写代码的网站其实只是因为这个看起来好玩. 闯关地址http://www.pythonchallenge.com/index.php 0x00 好吧,先来到第0关 python最好用的地方,计算器 2**38算出来答案,在url上修改即可进入下一关 0x01 进入第一关 看到提示,想到要根据图片中的提示得到转换方法,解密提示,显然不只有三种方法,而是每一个字符都右移两位,我还没有学到映射,就用了暴力转换(先全部变成大写)

sql-lib闯关秘籍之11-20关

下面开始11-20关,之前不会的关卡可以参考我这篇文章: sql-lib闯关秘籍之1-10关 不管是第几关,我们的最终目标是获得用户密码,从而获取最高权限! 以下的学习过程中如果遇到那里不会的或者不清楚的地方,欢迎大家留言,我将尽力帮助大家~ 11到21关的提交方式全是post型的,我这里使用burpsuit抓包软件,也可以用hackbar选中的post,下面的实验我们穿插的使用(用hackbar的时候我们的注释符号用#,不用--+,因为--+会出错) 第十一关 从这一关开始,我们就进入到了PO

sql-lib闯关秘籍之21-30关

下面开始11-20关,之前不会的关卡可以参考我这几篇文章: sql-lib闯关秘籍之1-10关,sql-lib闯关秘籍之11-20关 不管是第几关,我们的最终目标是获得用户密码,从而获取最高权限! 以下的学习过程中如果遇到那里不会的或者不清楚的地方,欢迎大家留言,我将尽力帮助大家~  第二十一关 我们输入用户名密码之后发现是这个样子的,和第20关很像对吧,就是cookie的值变成了一堆字母数字,这是对cookie的值进行了base64的处理,其他和20关一样 获取版本库名(我们只要转码就可以了)

sql-lib闯关秘籍之41-50关

下面开始11-20关,之前不会的关卡可以参考我这几篇文章: sql-lib闯关秘籍之1-10关,sql-lib闯关秘籍之11-20关,sql-lib闯关秘籍之21-30关,sql-lib闯关秘籍之41-50关 不管是第几关,我们的最终目标是获得用户密码,从而获取最高权限! 以下的学习过程中如果遇到那里不会的或者不清楚的地方,欢迎大家留言,我将尽力帮助大家~ 第四十一关 这关和第三十九关一样,只是错误没有回显 获得版本和数据库名   ?id=0 union select 1,version(),d

sql-lib闯关秘籍之61-65关

下面开始11-20关,之前不会的关卡可以参考我这几篇文章: sql-lib闯关秘籍之1-10关,sql-lib闯关秘籍之11-20关,sql-lib闯关秘籍之21-30关,sql-lib闯关秘籍之31-40关 ,sql-lib闯关秘籍之41-50关 ,sql-lib闯关秘籍之51-60关 不管是第几关,我们的最终目标是获得用户密码,从而获取最高权限! 以下的学习过程中如果遇到那里不会的或者不清楚的地方,欢迎大家留言,我将尽力帮助大家~ 马上就要结束了,亲爱的,兴奋吗!!!!!!!! 第六十一关