python challenge 30网址:www.pythonchallenge.com/pc/ring/yankeedoodle.html(用户名是repeat 密码是 switch )。
- 网页注释提示 <!-- while you look at the csv file -->
- 下载 http://www.pythonchallenge.com/pc/ring/yankeedoodle.csv
- 打开一看是逗号分割的,每行七个小于1的浮点数,总共有900多行
- 基本思路是:将浮点数的总数(7367)做因式分解,得到53和139
- 然后以此做为宽和高,用浮点数与256的乘积作为灰度值画成图片,
- 调整方向后得到公式
- 根据公式对浮点数3个一组操作,将结果转换为字符,得到下一关的名称。
源代码:
def level_30(): f=open(ur'd:yankeedoodle.csv') data=' '.join(f.read().splitlines()) f.close() fields=data.split(', ') # 注意是逗号加空格!如果只是空格,则后面拼message时只会得到乱码。 print len(fields) n=len(fields) # 输出 7367 # 因式分解之 def factor(n): "Adapted from http://www.math.utah.edu/~carlson/notes/python.pdf" d = 2 factors = [] while not n % d: factors.append(d) n /= d d = 3 while n > 1 and d * d <= n: if not n % d: factors.append(d) n /= d else: d += 2 if n > 1: factors.append(n) return factors print factor(n) # 输出 [53,139],也就是说 53*139=7367 ## im=Image.new('L',(53,139)) ## idata=[chr(int(float(x)*256)) for x in fields] ## im.fromstring(''.join(idata)) im=Image.new('F',(53,139)) # 'F'表示直接使用浮点数 im.putdata(map(float,fields),256) im=im.transpose(Image.FLIP_LEFT_RIGHT) # 左右翻转 im=im.transpose(Image.ROTATE_90) # 旋转90度 im.show() # 能看到公式 n=str(x[i])[5]+str(x[i+1])[5]+str(x[i+2])[6] nlist=[] for i in range(0,n-2,3): n=chr(int(fields[i][5]+fields[i+1][5]+fields[i+2][6])) nlist.append(n) print ''.join(nlist)
下一关网址:www.pythonchallenge.com/pc/ring/grandpa.html(用户名是repeat 密码是 switch )。