混乱的 Python:生命游戏

标签: python 生命游戏 | 发表时间:2011-09-21 20:48 | 作者:(author unknown) 饭团
出处:http://simple-is-better.com/

偶尔在 python.cn上看到一篇《谁说使用 Python 你就写不出混乱的代码?》,地址在这里。觉得非常有意思,记得使用Perl的时候,因为其灵活的语法,可以有很优美的代码书写方式,也可以写出非常混乱的代码。而Python,从一开始就致力于消除这种混乱,缩进的结构使得Python代码相对其他语言整齐了许多,刚开始用Python的时候虽然也想过能不能写出乱糟糟的代码,但是一开始就败在缩进上,也就慢慢忘记了。

分析

这次看到,自然是兴致盎然,稍微研究一下,发现它是把一些看似乱糟糟的字符串重新编码了,然后交给exec执行了。关键就在这一句:

exec(reduce(lambda x,i:x.replace(chr(i),"\n "[34-i:]), range(35), long_long_str)

用了Python的几个函数式编程的函数。lambda非常常用,reduce相对来说少用一些,但是需要使用的时候非常好用!

可能有人不是非常熟悉这个reduce函数,因为其他的语言里未必有这个东西,其实reduce的含义是折叠(我知道这么说还是很抽象),举一个小例子,让你计算0~100所有数字的和(OK,我知道你知道答案,但请编程实现),一般的话,就会这么写(这里不考虑等差数列的公式):

sum = 0
for i in range(101):
    sum += i
print sum

很简单,但是使用reduce会更简单:

print reduce(lambda x,y:x+y, range(101))

没有循环,没有中间变量,一句搞定!

它的运行过程如下图所示

reduce

reduce接受两个或三个参数,第一个为要执行的函数,第二个为一个序列,第三个这里先无视。

在我们这个例子的执行过程中,reduce从序列中取出两个值(0和1),相加计算出一个结果(1),然后再从序列中取出一个值(2),和刚刚得到结果(1)相加再得到一个结果(3),然后重复这个过程直到结束。

上面的混乱代码中,reduce对字符串不停的修正,把空白(空格和回车)删除,把!替换为空格,”替换为回车空格。然后得到一个格式完好的代码。换句话说,通过这个运算方法,我们把原先的代码中的空格和回车先用”或!替换以后,可以在代码中随意增加空格和换行了,图片的样子就是这么出来的。

生命游戏

知道了原理,我们就能很容易的造一个我们自己喜欢的混乱python代码了。不过我们可以看到,虽然有任意的回车和空白,我们还是能很容易的在字符串里看到python里的关键字,这样显得不够酷……

我把这个东西再升级了一下,字符全都混淆(ASCII值加1),基本就成乱码了,然后再用这个方法调整空白。

用pygame做了一个生命游戏的演示,代码写成一个骷髅头的样子(抱歉,非常的不像。。。。)。关于生命游戏,相信有些编程经验的应该会知道,可以在维基上看看说明,百度百科里好像更全一些,而这里,则有更学术性的研究。

代码完成后是这个样子的:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=r'''
               jnqpsu!sboepn"m>\\
             sboepn.d      ipjdf((
           0,2)                 )!gp
          s!j                      !jo
         !sb                        ohf
         (59)                      ^!gp
         s!j!                      jo!s
         bohf  (               5   9)^"
         l>\\  0!g           ps!  j!jo!
         sbohf  (59)^!   gps!j!   jo!sb
         ohf(59  )^"jn   qpsu!   qzhbnf
         "qzhbn   f.jo   ju()"   t>qzhb
         nf.ejt                  qmbz.t
         fu`npe       f((5        90,59
         0),0,43)"    p>Usv  f"efg!{(y,
         z);"!n>0"    !gps!  j!jo!(y-2,
          y,y+2);"    !!gps   !k!jo!(z
           -2, z   ,        z +2);"!!
           !jg! j > > y ! b o e !z>>k
  ;"!!!!d   poujo v f"!!!jg!(j= 0!ps !j?58!ps!
k=0!ps!k? 58);"!!!!dp oujovf" !!!jg!(m\j ^\k^);
"!! !  !n+>2"!sfuv s o ! n " jnqpsu!dpqz"xijmf!
p;"   !t.gjmm((36              6,366,36   6))"!
gps    !f!jo!qzhb              nf.fwfo    u.hfu
();    "!!jg!f.uz              qf>>23    ;"!!!p
>Gbmtf" !gps!y!jo!y   s      bohf(59     );"!!g
ps!z!jo!ysbo   hf(59);"!!!n>{(y   ,!z)"!!!jg!n>
  >3;"!!!!l\      y^\z^>m\y^\     z^"!!!fmjg!
     n>>4;"!!!      !l\y^\z     ^>2"!!!f
         mtf;"!!!!l\y^\z     ^>0"!!!
      jg!l\y^\z^;"!!!     !t.gjmm((0,0,3
66),(z*20,y*20,20,     20))"!!!!qzhbnf.esbx.sfd
u(t ,(0,0,0),(       z*20,y*2    0,20,20),2)"!m
>d                pqz.effqdpqz    (l  )"     !q
zhb  nf   .ej t qmbz.vqebuf()"!q z h  b      nf
.ujn  f    .xbju(200)"''';      exec( ''.join(
map(      lambda x:chr(ord(x)-1) if        ord(
x) > 49 else x,   reduce(   lambda x, i :  x.
replace( chr(i), "\n "[34-i:35-i] ), range(35),
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX))))

为了“清晰”起见,解码的代码就写在了最后没有混杂在里面了,稍微有些明白的就能打出原始代码来。

执行需要安装pygame库,执行效果如下(示意图,非连续):

希望能有“玩心”的朋友继续研究,让Python再混沌一些吧~~

# 来源:eyeHere


在微博上关注: 新浪, 腾讯   投稿

最新招聘

更多>>

相关 [python 生命游戏] 推荐:

混乱的 Python:生命游戏

- 饭团 - python.cn(jobs, news)
偶尔在 python.cn上看到一篇《谁说使用 Python 你就写不出混乱的代码. 觉得非常有意思,记得使用Perl的时候,因为其灵活的语法,可以有很优美的代码书写方式,也可以写出非常混乱的代码. 而Python,从一开始就致力于消除这种混乱,缩进的结构使得Python代码相对其他语言整齐了许多,刚开始用Python的时候虽然也想过能不能写出乱糟糟的代码,但是一开始就败在缩进上,也就慢慢忘记了.

dropbox讲python

- chuang - Initiative
dropbox定制优化CPython虚拟机,自己搞了个malloc调度算法. 那个 !!!111cos(0). 期待这次PyCon China 2011.

Python调试

- - 企业架构 - ITeye博客
原文地址: http://blog.csdn.net/xuyuefei1988/article/details/19399137. 1、下面网上收罗的资料初学者应该够用了,但对比IBM的Python 代码调试技巧:. IBM:包括 pdb 模块、利用 PyDev 和 Eclipse 集成进行调试、PyCharm 以及 Debug 日志进行调试:.

Python WSGI 初探

- - 坚实的幻想
在构建 Web 应用时,通常会有 Web Server 和 Application Server 两种角色. 其中 Web Server 主要负责接受来自用户的请求,解析 HTTP 协议,并将请求转发给 Application Server,Application Server 主要负责处理用户的请求,并将处理的结果返回给 Web Server,最终 Web Server 将结果返回给用户.

Python实现逻辑回归(Logistic Regression in Python)

- - 神刀安全网
Logistic Regression in Python ,作了中文翻译,并相应补充了一些内容. 本文并不研究逻辑回归具体算法实现,而是使用了一些算法库,旨在帮助需要用Python来做逻辑回归的训练和预测的读者快速上手. 逻辑回归是一项可用于预测二分类结果(binary outcome)的统计技术,广泛应用于金融、医学、犯罪学和其他社会科学中.

python 下载文件

- Eric - python相关的python 教程和python 下载你可以在老王python里寻觅
之前给大家分享的python 多线程抓取网页,我觉的大家看了以后,应该会对python 抓取网页有个很好的认识,不过这个只能用python 来抓取到网页的源代码,如果你想用做python 下载文件的话,上面的可能就不适合你了,最近我在用python 做文件下载的时候就遇到这个问题了,不过最终得以解决,为了让大家以后碰过这个问题有更好的解决办法,我把代码发出来:.

python代码调试

- - 阿里古古
【转自: http://blog.csdn.net/luckeryin/article/details/4477233】. 本文讨论在没有方便的IDE工具可用的情况下,使用pdb调试python程序. 例如,有模拟税收计算的程序:. debug_demo函数计算4500的入账所需的税收. 在需要插入断点的地方,加入红色部分代码:如果_DEBUG值为True,则在该处开始调试(加入_DEBUG的原因是为了方便打开/关闭调试).

python编程规范

- - 互联网 - ITeye博客
@FileName: @Author:[email protected] @Create date: @description:用一行文字概述模块或脚本,用句号结尾. 不影响编码的效率,不与大众习惯冲突.. 使代码的逻辑更清晰,更易于理解..   *所有的 Python 脚本文件都应在文件头标上如下标识或其兼容格式的标识.

Python 编程速成

- - SegmentFault 最新的文章
本文首发微信公众号:前端先锋. 欢迎关注,每天都给你推送新鲜的前端技术文章. Python是一种非常流行的脚本语言,而且功能非常强大,几乎可以做任何事情,比如爬虫、网络工具、科学计算、树莓派、Web开发、游戏等各方面都可以派上用场. 同时无论在哪种平台上,都可以用 Python 进行系统编程. 机器学习可以用一些 Python 库来实现,比如人工智能常用的 TensorFlow.

《Dive into Python 3》中文版

- hama - Wow! Ubuntu
Dive Into Python 是一份很知名的 Python 入门教程,由 Mark Pilgrim 编写,用户可以免费获取电子版本,而中文版则由啄木鸟社区翻译发布 [ 英文版 / 中文版 ]. 前阵子,Mark Pilgrim 又发布了 《Dive into Python 3》,此版本的内容涵盖了 Python 3 及其与 Python 2 的区别.