pythonRiddle谜题Level0-5

http://wiki.pythonchallenge.com/index.php?title=Main_Page

/home/admin/---/pythonRiddle

level 0 

http://www.pythonchallenge.com/pc/def/0.html

>>> 2**38
274877906944

level 1

http://www.pythonchallenge.com/pc/def/map.html

最好的办法:

# -* - coding: UTF-8 -* -
#使用string模块的maketrans和translate来解决凯撒密码
import string

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.kyicrp
ylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
str2 = "map"

table = string.maketrans(string.ascii_lowercase,string.ascii_lowercase[2:]+string.ascii_lowercase[:2])
print string.translate(str1,table)
print string.translate(str2,table)

# -* - coding: UTF-8 -* -
#python对字符的处理,凯撒密码,

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."

str2 = "map"
def decode(c):

    if ord(c)>=ord("a") and ord(c)+2<=ord("z"):
        return chr(ord(c)+2)
    elif c=="y" or c=="z":
        return chr(ord(c)+1-ord("z")+ord("a"))
    else :
        return c

hint = ""
for c in str:
    hint+=decode(c)
print hint

answer = ""
for c in str2:
    answer+=decode(c)
print answer


level 2

http://www.pythonchallenge.com/pc/def/ocr.html

# -* - coding: UTF-8 -* -
#python对字符的处理
import os,sys,urllib

def download(url):
    data=urllib.urlopen(url).read()
    begin = data.find("find rare characters in the mess below:")
    begin+=40
    key = data[begin:]
    answer = ""
    for char in key:
        if char.isalpha():
            answer += char
    print answer


if __name__ == "__main__":
    if len(sys.argv) != 2:
        print "Usage: %s <args>" % sys.argv[0]
        exit(1)

    url = sys.argv[1]
    download(url)

level 3

http://www.pythonchallenge.com/pc/def/equality.html

刚开始以为是四面八方都恰好三个,没看图可能。结果是y

# -* - coding: UTF-8 -* -
#换行,结尾加"\"
#三元操作符  V1 if X else V2
import os,sys,urllib

def download(url):
    data=urllib.urlopen(url).read()
    strBegin = "kAewtloYgcFQaJNhHVGxXDiQmzjfcpYbzxlWrVcqsmUbCunkfxZWDZjUZMiGqhRRiUvGmYmvnJIHEmbT"
    strEnd = "-->"
    begin = data.find(strBegin)
    end = data.find(strEnd)
    end-=1
    content = data[begin:end]
    lines = content.split("\n")
    answer = ""
    #这样处理了0到79,其可以使用序号
    for i in range(len(lines)):
            for j in range(len(lines[i])):
                if (i!=0) and (i!=len(lines)-1) and (j!=0) and (j!=len(lines[0])-1) :
                    if  lines[i-1][j-1].isupper()and lines[i-1][j].isupper()and lines[i-1][j+1].isupper()\
                    and lines[i][j-1].isupper()  and lines[i][j].islower()  and lines[i][j+1].isupper()\
                    and lines[i+1][j-1].isupper()and lines[i+1][j].isupper()and lines[i+1][j+1].isupper()\
                    and (lines[i-1][j-2].islower()if (j-2)>0 else True) and (lines[i-1][j+2].islower()if (j+2)<=(len(lines[0])-1) else True)\
                    and (lines[i+1][j-2].islower()if (j-2)>0 else True) and (lines[i+1][j+2].islower()if (j+2)<=(len(lines[0])-1) else True)\
                    and (lines[i-2][j-1].islower()if (i-2)>0 else True) and (lines[i+2][j-1].islower()if (i+2)<=(len(lines)-1) else True)\
                    and (lines[i-2][j+1].islower()if (i-2)>0 else True) and (lines[i+2][j+1].islower()if (i+2)<=(len(lines)-1) else True):

                        print lines[i][j]+"(%s,%s,%s)"%(i,j,lines[i])

                        answer+=lines[i][j]

    print answer
if __name__ == "__main__":
    if len(sys.argv) != 2:
        print "Usage: %s <args>" % sys.argv[0]
        exit(1)

    url = sys.argv[1]
    download(url)

输入后不正确,然后又想恰好三个,于是改写后还是不对是个x。

改进为只在一维考虑,并且不考虑边界,其实就是...oXXXoXXXo...

# -* - coding: UTF-8 -* -
#换行,结尾加"\"
#三元操作符  V1 if X else V2
import os,sys,urllib
import re

def download(url):
    data=urllib.urlopen(url).read()
    strBegin = "kAewtloYgcFQaJNhHVGxXDiQmzjfcpYbzxlWrVcqsmUbCunkfxZWDZjUZMiGqhRRiUvGmYmvnJIHEmbT"
    strEnd = "-->"
    begin = data.find(strBegin)
    end = data.find(strEnd)
    end-=1
    content = data[begin:end]
    #这里实际上需要匹配的是这样的每一行:ooooooooooooooooooooooXXXoXXXooooooooooooooooo这样的
    #[A-Z]{3} means exactly 3 capital letters.
    #The brackets () are used to define groups. For each matching pattern, only the group is returned. i
    #Putting "".join() around it changes it from a list of letters to a continuous string, just for clarity.
    print "".join(re.findall(r"[a-z][A-Z]{3}([a-z])[A-Z]{3}[a-z]",content))


if __name__ == "__main__":
    if len(sys.argv) != 2:
        print "Usage: %s <args>" % sys.argv[0]
        exit(1)

    url = sys.argv[1]
    download(url)

得到结果。

level 4

http://www.pythonchallenge.com/pc/def/linkedlist.php

import urllib,os,sys

count = 12345
times = 400
sentence = "and the next nothing is "
for i in range(times):
    url = "http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=%s"%count
    content = urllib.urlopen(url).read()
    begin = content.find(sentence)
    begin+=len(sentence)
    count = content[begin:]
    print "%d\t:%s"%(i,url)
    print content

level 5

http://www.pythonchallenge.com/pc/def/peak.html

有点坑爹呀,论坛看了半天,这个我怎么pronounce都不会这么敏感的。

下载部分:

import urllib,sys

url = "http://www.pythonchallenge.com/pc/def/banner.p"
print url
content = urllib.urlopen(url).read()
f = open("./banner.p","w")
f.write(content)
f.close()
显示部分:

import pickle

f = open("./banner.p")
content = f.read()
f.close()
object = pickle.loads(content)
for line in object:
    pic = ""
    for tuple in line:
        char = tuple[0]
        times = tuple[1]
        for i in range(times):
            pic+=char
    print pic

更简洁的:

import pickle

f = open("./banner.p")
content = f.read()
f.close()
object = pickle.loads(content)
for line in object:
    print "".join(map(lambda pair:pair[0]*pair[1],line))

level 6

http://www.pythonchallenge.com/pc/def/channel.html
首先:

http://www.pythonchallenge.com/pc/def/zip.html

http://www.pythonchallenge.com/pc/def/channel.zip

import sys,os
import zipfile

next = "90052"
zip = zipfile.ZipFile("./channel.zip")
result = ""
while True:
    file = next + ".txt"
    print "   find next file :%s"%file
    if not os.path.exists(file):
        print "error: file %s not exists."%file
        break
    else :
        f = open(file)
        content = f.read()
        f.close()
        result += zip.getinfo(file).comment
        print "file:%s %s"%(file,content)
        begin = content.find("Next nothing is ")
        if begin<0:
            break
        else:
            begin+=len("Next nothing is ")
            next = content[begin:]

print result
http://www.pythonchallenge.com/pc/def/hockey.html

level 7

http://www.pythonchallenge.com/pc/def/oxygen.html

下载文件:

import urllib
url = "http://www.pythonchallenge.com/pc/def/oxygen.png"
filename = url[url.rfind("/"):]
print filename
content = urllib.urlopen(url).read()
f = open("."+filename,"w")
f.write(content)
f.close()
处理图片:

# -* - coding: UTF-8 -* -
import Image
im = Image.open("./oxygen.png")
width = im.size[0]
height = im.size[1]
print im.format, im.size, im.mode
#for y in range(height):
#    print "%d:%s"%(y,im.getpixel((0,y)))
#所以可以选择 y = 46
list = []
prePixel = (0,0,0)
for x in range(width):
    pixel = im.getpixel((x,46))
    #实际上R G B 通道的值是一样的
    if pixel != prePixel and pixel[0]==pixel[1]and pixel[1]==pixel[2]:
        list.append(pixel)
        prePixel = pixel
result = ""
for pixel in list:
    result+=chr(pixel[2])
print result

结论是:smart guy, you made it. the next level is [105, 10, 16, 101, 103, 14, 105, 16, 121]

注意这样是错的,原因是,如果两个都是1,那么只能识别一个!坑爹。还是找到每7个变换一下的规律。

# -* - coding: UTF-8 -* -
import Image
im = Image.open("./oxygen.png")
width = im.size[0]
height = im.size[1]
print im.format, im.size, im.mode
#for y in range(height):
#    print "%d:%s"%(y,im.getpixel((0,y)))
#所以可以选择 y = 46
print ''.join([chr(im.getpixel((i, 43))[0]) for i in xrange(0, 609, 7)])

再做一次:

hint = [105, 110, 116, 101, 103, 114, 105, 116, 121]
result = ""
for i in hint:
    result+=chr(i)
print result

level 8 

http://www.pythonchallenge.com/pc/def/integrity.html

import bz2
un = 'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084'
pw = 'BZh91AY&SY\x94$|\x0e\x00\x00\x00\x81\x00\x03$ \x00!\x9ah3M\x13<]\xc9\x14\xe1BBP\x91\xf08'
print bz2.decompress(un)
print bz2.decompress(pw)

得到关键字:

huge,file

level 9 

http://www.pythonchallenge.com/pc/return/good.html

import Image,ImageDraw
import urllib

first = [
146,399,163,403,170,393,169,391,166,386,170,381,170,371,170,355,169,346,167,335,170,329,170,320,170,
310,171,301,173,290,178,289,182,287,188,286,190,286,192,291,194,296,195,305,194,307,191,312,190,316,
190,321,192,331,193,338,196,341,197,346,199,352,198,360,197,366,197,373,196,380,197,383,196,387,192,
389,191,392,190,396,189,400,194,401,201,402,208,403,213,402,216,401,219,397,219,393,216,390,215,385,
215,379,213,373,213,365,212,360,210,353,210,347,212,338,213,329,214,319,215,311,215,306,216,296,218,
290,221,283,225,282,233,284,238,287,243,290,250,291,255,294,261,293,265,291,271,291,273,289,278,287,
279,285,281,280,284,278,284,276,287,277,289,283,291,286,294,291,296,295,299,300,301,304,304,320,305,
327,306,332,307,341,306,349,303,354,301,364,301,371,297,375,292,384,291,386,302,393,324,391,333,387,
328,375,329,367,329,353,330,341,331,328,336,319,338,310,341,304,341,285,341,278,343,269,344,262,346,
259,346,251,349,259,349,264,349,273,349,280,349,288,349,295,349,298,354,293,356,286,354,279,352,268,
352,257,351,249,350,234,351,211,352,197,354,185,353,171,351,154,348,147,342,137,339,132,330,122,327,
120,314,116,304,117,293,118,284,118,281,122,275,128,265,129,257,131,244,133,239,134,228,136,221,137,
214,138,209,135,201,132,192,130,184,131,175,129,170,131,159,134,157,134,160,130,170,125,176,114,176,
102,173,103,172,108,171,111,163,115,156,116,149,117,142,116,136,115,129,115,124,115,120,115,115,117,
113,120,109,122,102,122,100,121,95,121,89,115,87,110,82,109,84,118,89,123,93,129,100,130,108,132,110,
133,110,136,107,138,105,140,95,138,86,141,79,149,77,155,81,162,90,165,97,167,99,171,109,171,107,161,
111,156,113,170,115,185,118,208,117,223,121,239,128,251,133,259,136,266,139,276,143,290,148,310,151,
332,155,348,156,353,153,366,149,379,147,394,146,399]

second = [
156,141,165,135,169,131,176,130,187,134,191,140,191,146,186,150,179,155,175,157,168,157,163,157,159,
157,158,164,159,175,159,181,157,191,154,197,153,205,153,210,152,212,147,215,146,218,143,220,132,220,
125,217,119,209,116,196,115,185,114,172,114,167,112,161,109,165,107,170,99,171,97,167,89,164,81,162,
77,155,81,148,87,140,96,138,105,141,110,136,111,126,113,129,118,117,128,114,137,115,146,114,155,115,
158,121,157,128,156,134,157,136,156,136]

data = urllib.urlopen("http://www.pythonchallenge.com/pc/return/good.jpg").read()
f = open("./good.jpg","w")
f.write(data)
f.close()

image = Image.open("./good.jpg")
newimage = Image.new(image.mode,image.size)
draw = ImageDraw.Draw(newimage)
draw.line(first,fill='#fff')
draw.line(second,fill='#fff')
print draw
newimage.save("./newImage.png")

level 10 

http://www.pythonchallenge.com/pc/return/bull.html

一种称为Look-and-say sequence的特殊数列

import string
def say(look):
    answer = ""
    s = str(look)
    base = s[0]
    count = 0
    for i in range(len(s)):
        if s[i]==base:
            count+=1
        else :
            answer = answer + str(count) + base
            count = 1
            base = s[i]
    answer = answer + str(count) + base
    return answer



next = "1"
for i in range(31):
    print "%d:%s:%s\n"%(i+1,next,len(next))
    next = say(next)

level 11

http://www.pythonchallenge.com/pc/return/5808.html

图像处理模块真心没那么感冒,可以参考博客:http://blog.csdn.net/kosl90/article/details/7270177

level 12

http://www.pythonchallenge.com/pc/return/evil.html

实际上不是图片处理。观察发现图片地址是:

http://www.pythonchallenge.com/pc/return/evil1.jpg

对应的还有几张图片,分析图片含义

http://www.pythonchallenge.com/pc/return/evil2.jpg not jpg --.gfx  所以下载http://www.pythonchallenge.com/pc/return/evil2.gfx

http://www.pythonchallenge.com/pc/return/evil3.jpg no more evils

http://www.pythonchallenge.com/pc/return/evil4.jpg 无法显示图像,在ie下可以显示Bert is evil! go back!

所以只需要处理evil2.gfx。具体可以参考:http://blog.csdn.net/kosl90/article/details/7270605

对于需要显示图片的,我都不想去做了,over。


level 13

http://www.pythonchallenge.com/pc/return/disproportional.html

根据Bert拨出数字:2378

还有一个链接地址:http://www.pythonchallenge.com/pc/phonebook.php,其中是一个XML文件。

查资料,本题可以使用模块:sudo easy_install xmlrpclib

import xmlrpclib
xmlrpc = xmlrpclib.ServerProxy("http://www.pythonchallenge.com/pc/phonebook.php")
print xmlrpc.system.listMethods()
print xmlrpc.system.methodHelp('phone')
print xmlrpc.phone('Bert')
得到电话:555-ITALY

level 14【10 28 周六 解掉】

http://www.pythonchallenge.com/pc/return/italy.html







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值