[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[原创代码] 用 sed 解生命游戏

本帖最后由 CrLf 于 2014-9-29 06:45 编辑

老早就想用正则做这个了,这阵子某两位坛友突然搞起绳命游戏来,那我也折腾折腾紧跟潮流好了
感觉用纯正则可以替代循环,但想过去太繁琐,还是有什么用什么比较实在
为了方便测试所以用了七条 sed,至于怎么合并成一条,有一点大致的思路,不知道可不可行
  1. @echo off
  2. (for %%a in (
  3. ▓■■■▓▓▓▓
  4. ▓▓▓▓▓▓▓▓
  5. ▓▓▓▓▓▓▓▓
  6. ▓▓■■▓▓▓▓
  7. ▓■■■▓▓▓▓
  8. ▓▓■▓▓▓▓▓
  9. ▓▓▓▓▓▓▓▓
  10. ▓▓▓▓▓▓▓▓
  11. ) do echo %%a)>a.txt
  12. ::生成初始图,任意高宽都可以
  13. :loop
  14. set /a num+=1
  15. title 第 %num% 次循环
  16. sed -r "s/■/1/g;s/▓/0/g" a.txt>b.txt
  17. ::第一步,从兼容性和简洁两方面考虑,将字符映射为 0 和 1
  18. sed -r -n "s/(.).*(.)/\2&\1/;H;${g;s/([^\n]+).*\n(.+)/\2\n&\n\1/;p}" b.txt>c.txt
  19. ::第二步,根据对边向外扩展
  20. sed -r ":a;s/^(\w)(\w)(\w)(.*)/\2\3\4#\2\1\3/;ta;s/^\w+//" c.txt >d.txt
  21. ::第三步,为每列生成其左右列的索引
  22. sed -r -n "H;${g;s/^\n+//g;:b;:a;s/^(\S+)\n(\S+)\n(\S+)\n(.*)/\2\n\3\n\4\n\n\2 \1 \3/;tb;s/^\S+\n(\S+\n)?//;s/\n\n/\n/g;p}" d.txt>e.txt
  23. ::第四步,为每行生成其上下行的索引
  24. sed -r -n "/./{:c;s/#(...)(.* )#(...)(.* )#(...)(.*)/\2\4\6@\1\3\5/;tc;s/ //g;p}" e.txt>f.txt
  25. ::第五步,连接行列索引
  26. sed -r "s/([01])0+/\1/g;s/@(.)11\>/~\1/g;s/@.111\>/~1/g;s/@[01]+/~0/g;" f.txt>g.txt
  27. ::第六步,根据周边八格存活的数量判断当前格的生死
  28. sed "s/~1/■/g;s/~0/▓/g" g.txt>h.txt
  29. ::第七步,做第一步的逆操作
  30. cls & type h.txt
  31. echo 任意键查看下一个循环
  32. pause
  33. type h.txt>a.txt
  34. goto :loop
复制代码
--------------------------------------------------------------------
链接:
绳命游戏的介绍和 bat 版:http://bbs.bathome.net/viewthread.php?tid=11049
perl 版:http://bbs.bathome.net/thread-31995-1-1.html
python 版:http://bbs.bathome.net/thread-32111-1-1.html
1

评分人数

    • yu2n: 感谢分享技术 + 1

本帖最后由 CrLf 于 2014-9-29 17:26 编辑

另附改进后的 bat 版生命游戏算法(第 6 版),在原先算法(第 5 版)的基础上提高 25% 效率:
  1. @echo off &setlocal enabledelayedexpansion
  2. echo>计时.txt %time%
  3. for /f "delims==" %%a in ('set') do set %%a=
  4. echo 第1代
  5. for /f "skip=29 useback delims=" %%a in ("%~0") do (
  6. echo %%a
  7. set /a "行25+=1"
  8. set tmp=%%a&set "tmp=!tmp:■=1!"&set tmp=!tmp:▓=0!
  9. set 行!行25!=!tmp:~-1!!tmp!!tmp:~0,1!
  10. )
  11. set 行27=000000000000000000000000000
  12. for /l %%i in (2 1 100) do (
  13. echo 第%%i代
  14. set 行0=!行25!&set 行26=!行1!
  15. for /l %%Y in (0 1 25) do (
  16. set tmp=
  17. set /a y1=%%Y+1,y2=y1+1
  18. for /f "tokens=1,2" %%a in ("!y1! !y2!") do (
  19. for /l %%X in (0 1 24) do (
  20. set /a "xy=(0!行%%Y:~%%X,3!!行%%a:~%%X,3!!行%%b:~%%X,3!&0111101111)%%7,xy=^!(xy-2)*(!行%%a:~%%X,2!&1)+^!(xy-3)"
  21. set tmp=!tmp!!xy!
  22. )
  23. )
  24. set 行%%Y=!last:~-1!!last!!last:~0,1!
  25. if !y1! neq 26 set last=!tmp!&set tmp=!tmp:1=■!&echo !tmp:0=▓!
  26. )
  27. )
  28. echo>>计时.txt %time%
  29. type 计时.txt&pause&exit
  30. ▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
  31. ▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
  32. ▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓▓■■■▓
  33. ▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
  34. ▓■■■▓▓▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓
  35. ▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
  36. ▓■■■▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓▓▓
  37. ▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓▓■■■▓▓
  38. ▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
  39. ▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
  40. ▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓
  41. ▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
  42. ▓■▓▓■■■▓▓▓▓▓■■▓▓▓▓▓■■■▓▓▓
  43. ▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
  44. ▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
  45. ▓■■■▓▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓
  46. ▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
  47. ▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓▓■■■▓▓
  48. ▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
  49. ▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
  50. ▓■■■▓▓▓▓▓■■▓▓▓▓▓■■▓▓▓▓▓■■
  51. ▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
  52. ▓■▓■■■▓▓▓▓▓■■▓▓▓▓▓■■■▓▓▓▓
  53. ▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
  54. ▓■■■▓▓▓▓▓■■■▓▓▓▓▓■■■▓▓▓▓▓
复制代码
2

评分人数

TOP

回复 5# neorobin


赞,殚精竭虑折腾了好久才鼓搞出来,以为再无可改进,结果没想到这里可以用位运算代替乘法和加法,看来需要培养培养位运算的直觉
据我所知,neorobin 和 plp626 大概是论坛里数学最好的吧
如果还有潜伏着其他的陈景润和高斯,就怪我眼瞎好了
5230 和 netbenton 虽也精通特效,但貌似是胜在逻辑而非数学造诣

TOP

返回列表