批处理编程竞赛 第2011-001期[Life 游戏]
上世纪70年代,一些人曾疯迷于一种被称作“生命(life)游戏”的小游戏,这种游戏相当简单。
假设有一个象棋盘一样的方格网,每个方格中放置一个生命细胞,生命细胞只有两种状态:
“生”或“死”。由英国数学家John Conway确定的游戏规则如下:
(1)如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),则该细胞为生,
即该细胞若原先为死,则转为生,若原先为生,则保持不变;
(2)如果一个细胞周围有2个细胞为生,则该细胞的生死状态保持不变;
(3)在其它情况下,该细胞为死,即该细胞若原先为生,则转为死,若原先为死,则保持不变。
依此规则进行迭代变化,使细胞生生死死,会得到一些有趣的结果。该游戏之所以被称为生命游戏,
是因为其简单的游戏规则反映了自然界中这样的生存规律:如果一个生命,其周围的同类生命太少的话,
会因为得不到帮助而死亡,如果太多,则会因为得不到足够的生命资源而死亡。
用计算机模拟这个生命游戏也相当简单,可以用一个M×N象素的图象来代表M×N个细胞,
其中每一个象素,代表一个细胞,象素为黑色表示细胞为生,象素为白色代表细胞为死。
例如一个图象中几个象素所代表的生命的初始状态如下图所示,依上述规则进行行迭代变化,
则经过1次、2次、3次变化后的情况分别如下图所示:
活:■
死:▓
第 1 代
▓■■■▓▓▓▓
▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓
▓▓■■▓▓▓▓
▓■■■▓▓▓▓
▓▓■▓▓▓▓▓
▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓
第 2 代
▓▓■▓▓▓▓▓
▓▓■▓▓▓▓▓
▓▓▓▓▓▓▓▓
▓■▓■▓▓▓▓
▓■▓▓▓▓▓▓
▓■■■▓▓▓▓
▓▓▓▓▓▓▓▓
▓▓■▓▓▓▓▓
第 3 代
▓■■■▓▓▓▓
▓▓▓▓▓▓▓▓
▓▓■▓▓▓▓▓
▓▓■▓▓▓▓▓
■■▓■▓▓▓▓
▓■■▓▓▓▓▓
▓■▓■▓▓▓▓
▓▓▓▓▓▓▓▓
设定图象中每个象素的初始状态后依据上述的游戏规则演绎生命的变化,由于初始状态和迭代次数不同,
将会得到令人叹服的优美图案。
我认为,其实这是一个让程序员练手的游戏,现出一批处理代码效率比赛题:
1,格子矩阵大小:25 X 25 初始图如下(第1代):
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓▓■■■▓
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
▓■■■▓▓▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
▓■■■▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓▓▓
▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓▓■■■▓▓
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
▓■▓▓■■■▓▓▓▓▓■■▓▓▓▓▓■■■▓▓▓
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
▓■■■▓▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓▓■■■▓▓
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
▓■■■▓▓▓▓▓■■▓▓▓▓▓■■▓▓▓▓▓■■
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
▓■▓■■■▓▓▓▓▓■■▓▓▓▓▓■■■▓▓▓▓
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
2,顶边与底边,还有左边与右边,认为是相连接的;
2.1 补充一点:对角点也认为是相连接的,如图点A,周围的8个点,分别对应对角和对边的位置。
B■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓cc
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓▓■■■▓
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
▓■■■▓▓▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
▓■■■▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓▓▓
▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓▓■■■▓▓
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
▓■▓▓■■■▓▓▓▓▓■■▓▓▓▓▓■■■▓▓▓
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
▓■■■▓▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓▓■■■▓▓
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
▓■■■▓▓▓▓▓■■▓▓▓▓▓■■▓▓▓▓▓■■
▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
▓■▓■■■▓▓▓▓▓■■▓▓▓▓▓■■■▓▓▓▓
d■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓d
d■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓Ad
ccB
3,主程序用批处理完成,可用三方命令。但是用纯其它语言编写的游戏,仅仅还原成可执行文件运行的不算
4,以算到第100代时所花的时间作为本次比赛标准,
注意:要把每一代结果都显示出来,
5, 这是很要效率的,可以先写出一个可行的版本,然后慢慢优化;
6,请参加的朋友于2011-03-07 到 2011-03-10 上传作品,请以附件形式上传,
并设置阅读权限为240,防止他人抄袭。评比结果最后公布在本楼。
看看谁写的代码速度最快。一个月后(2011-03-13),将给予相应积奖励:
效率最高的: 100积分 10技术
第二名: 50积分 5技术
第三名: 20积分 2技术
终于到公示代码日期了~~~
代码测试环境:
操作系统 WINXP SP3 关闭杀毒软件 不运行任何其它程序
CPU: AMD3200 1G内存DDR677
说明:
各选手文件夹内的 file.bat 是加入统一的计时后的代码,
选手的原代码为另一个文件,欢迎测试、监督、指正。
公示名次:
获奖名次 选手 大约用时
第1名 zm900612 00:00:09:65
第2名 terse 00:00:14:12
第3名 caruko 00:00:15:43
其它就不公布了,想了解和监督的朋友请下载附件。
按照料 batcher 所说的方法测试代码,排名并没有变化,
公示三天已过,得出本次竞赛最终结果为:
获奖名次 选手 大约用时
第1名 zm900612 00:00:09:65
第2名 terse 00:00:14:12
第3名 caruko 00:00:15:43
链接: https://pan.baidu.com/s/10YE94hvl50Eqr2uRKtBZMw?pwd=jau6 |