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