免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: bikkuri
打印 上一主题 下一主题

[文本处理] 细胞分裂游戏 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2014-04-01 11:34 |只看该作者
回复 10# bikkuri

你需要更清楚地定义下这句话
"死亡后的.在下一年中仍保留但不做任何变化。"
是指死亡的下一年显示, 然后就彻底消失, 还是说死亡的一直都显示出来

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
12 [报告]
发表于 2014-04-01 12:17 |只看该作者
一直显示啊。

runintostar 发表于 2014-04-01 11:34
回复 10# bikkuri

你需要更清楚地定义下这句话

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
13 [报告]
发表于 2014-04-01 12:21 |只看该作者
回复 10# bikkuri

script:
  1. #!/usr/bin/perl
  2. use 5.010;
  3. my @cells;
  4. my $cell = "o";
  5. my $count = 0;
  6. while ( $count < 100 ) {
  7.         my @each = $cell =~ /./g;
  8.         for my $i ( 0 .. $#each ) {
  9.                 given ( rand() ) {
  10.                         when ( $_ < 1/10 ) { $each[$i] = "." }
  11.                         when ( $_ < 2/10 ) { $each[$i] = "o." if $each[$i] eq "8" }
  12.                         default {
  13.                                 given ( $each[$i] ) {
  14.                                         when ( "o" ) { $each[$i] = "0" }
  15.                                         when ( "0" ) { $each[$i] = "8" }
  16.                                         when ( "8" ) { $each[$i] = "oo" }
  17.                                 }
  18.                         }
  19.                 }
  20.         }
  21.         $cell = join "", @each;
  22.         push @cells, $cell;
  23.         $count++;
  24.         say "[$count]\t$cell";
  25.         $cell =~ /^\.+$/ && exit;
  26.         sleep 1;
  27. }
  28. say "-" x 50;
  29. say join "\t", "", "[.]", "[o]", "[0]", "[8]", "[.o08]";
  30. for my $i ( 0 .. $#cells ) {
  31.         my $f5 = $cells[$i] =~ s/\.o08//g;
  32.         my $f4 = $cells[$i] =~ s/8//g;
  33.         my $f3 = $cells[$i] =~ s/0//g;
  34.         my $f2 = $cells[$i] =~ s/o//g;
  35.         my $f1 = $cells[$i] =~ s/\.//g;
  36.         say join "\t", "[".($i+1)."]:", $f1||0, $f2||0, $f3||0, $f4||0, $f5||0;
  37. }
复制代码
result:
result.rar (155.87 KB, 下载次数: 4)
   

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
14 [报告]
发表于 2014-04-01 12:48 |只看该作者
本帖最后由 bikkuri 于 2014-04-01 13:23 编辑

哇!这个程序很完美啊!而且运算速度很快啊,每代的计算都可以在1秒钟之内完成啊!
为什么用awk效率那么低呢?
但是后面世代细胞数的计算有一个地方错了:
[.o08]是指所有的细胞数,而不是指.o08死幼成分四个连续状态的细胞组合数。
[.o08]应该是[.]+[o]+[0]+[8],把四种状态的细胞数量加起来就好。
  1.         [.]        [o]        [0]        [8]        [.o08]
  2. [90]:   2513    800     670     524     4507
  3. [91]:   2769    974     701     532     4976
  4. [92]:   3040    1013    846     565     5464
  5. [93]:   3344    1068    898     671     5981
  6. [94]:   3687    1243    948     704     6582
  7. [95]:   4016    1347    1112    747     7222
  8. [96]:   4422    1415    1179    883     7899
  9. [97]:   4890    1610    1239    941     8680
  10. [98]:   5381    1752    1399    984     9516
  11. [99]:   5906    1823    1543    1128    10400
  12. [100]:  6458    2117    1620    1222    11417
复制代码
看来即使是10%的死亡率,死去的细胞数都超过总细胞数的一半以上啊。。。
还有就是perl脚本可以在shell下直接执行,但是不能用tee或者重定向把结果重定向到文件啊?
这次执行产生的细胞数差不多是上一次的三倍:
  1.         [.]        [o]        [0]        [8]        [.o08]
  2. [90]:   6993    2179    1851    1350    12373
  3. [91]:   7708    2479    1917    1471    13575
  4. [92]:   8417    2783    2179    1545    14924
  5. [93]:   9264    2839    2456    1735    16294
  6. [94]:   10138   3268    2515    1933    17854
  7. [95]:   11081   3602    2883    2036    19602
  8. [96]:   12111   3815    3225    2278    21429
  9. [97]:   13285   4278    3345    2576    23484
  10. [98]:   14574   4765    3768    2675    25782
  11. [99]:   15966   4979    4204    3009    28158
  12. [100]:  17503   5642    4374    3363    30882
复制代码
yestreenstars 发表于 2014-04-01 12:21
回复 10# bikkuri

script:result:

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
15 [报告]
发表于 2014-04-01 13:22 |只看该作者
回复 14# bikkuri


    你把awk的sleep去掉试试

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
16 [报告]
发表于 2014-04-01 13:27 |只看该作者
本帖最后由 bikkuri 于 2014-04-01 13:27 编辑

去掉sleep以后,速度没什么变化。
到80代以后速度很慢。
到95代以后计算一代需要十分钟以上。
计算第100代需要半个小时以上。

yinyuemi 发表于 2014-04-01 13:22
回复 14# bikkuri

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
17 [报告]
发表于 2014-04-01 13:33 |只看该作者
回复 14# bikkuri

你之前又没说清楚,咋知道你什么意思?
简单修改一下就好了。
  1. #!/usr/bin/perl
  2. use 5.010;
  3. my @cells;
  4. my $cell = "o";
  5. my $count = 0;
  6. while ( $count < 100 ) {
  7.         my @each = $cell =~ /./g;
  8.         for my $i ( 0 .. $#each ) {
  9.                 given ( rand() ) {
  10.                         when ( $_ < 1/10 ) { $each[$i] = "." }
  11.                         when ( $_ < 2/10 ) { $each[$i] = "o." if $each[$i] eq "8" }
  12.                         default {
  13.                                 given ( $each[$i] ) {
  14.                                         when ( "o" ) { $each[$i] = "0" }
  15.                                         when ( "0" ) { $each[$i] = "8" }
  16.                                         when ( "8" ) { $each[$i] = "oo" }
  17.                                 }
  18.                         }
  19.                 }
  20.         }
  21.         $cell = join "", @each;
  22.         push @cells, $cell;
  23.         $count++;
  24.         say "[$count]\t$cell";
  25.         $cell =~ /^\.+$/ && exit;
  26.         sleep 1;
  27. }
  28. say "-" x 50;
  29. say join "\t", "", "[.]", "[o]", "[0]", "[8]", "[.o08]";
  30. for my $i ( 0 .. $#cells ) {
  31.         my $f1 = $cells[$i] =~ s/\.//g;
  32.         my $f2 = $cells[$i] =~ s/o//g;
  33.         my $f3 = $cells[$i] =~ s/0//g;
  34.         my $f4 = $cells[$i] =~ s/8//g;
  35.         my $f5 = $f1 + $f2 + $f3 + $f4;
  36.         say join "\t", "[".($i+1)."]:", $f1||0, $f2||0, $f3||0, $f4||0, $f5||0;
  37. }
复制代码
我的result.txt就是用重定向得到的。
   

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
18 [报告]
发表于 2014-04-01 14:55 |只看该作者
你的重定向命令怎么写的?

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
19 [报告]
发表于 2014-04-01 15:20 |只看该作者
回复 14# bikkuri

根据我的perl脚本改写的awk脚本:
  1. #!/bin/awk -f
  2. BEGIN {
  3.         srand()
  4.         s="o"
  5.         for(i=0;i++<100;){
  6.                 l=split(s,a,"")
  7.                 for(j=0;j++<l;){
  8.                         r=rand()
  9.                         if(r<1/10){
  10.                                 a[j]="."
  11.                         }else if(r<2/10){
  12.                                 if(a[j]=="8")a[j]="o."
  13.                         }else{
  14.                                 if(a[j]=="8")a[j]="oo"
  15.                                 if(a[j]=="0")a[j]="8"
  16.                                 if(a[j]=="o")a[j]="0"
  17.                         }
  18.                 }
  19.                 s=""
  20.                 for(j=0;j++<=l;)s=s!=""?s""a[j]:a[j]
  21.                 b[i]=s
  22.                 printf "[%d]\t%s\n",i,s
  23.                 if(s~/^\.+$/)exit
  24.                 system("sleep 1")
  25.         }
  26.         for(i=0;i++<10;)printf "-----"
  27.         print "\n\t[.]\t[o]\t[0]\t[8]\t[.o08]"
  28.         for(i=0;i++<length(b);){
  29.                 f5=length(b[i])
  30.                 f4=gsub(/8/,"",b[i])
  31.                 f3=gsub(/0/,"",b[i])
  32.                 f2=gsub(/o/,"",b[i])
  33.                 f1=f5-f4-f3-f2
  34.                 printf "[%d]:\t%d\t%d\t%d\t%d\t%d\n",i,f1,f2,f3,f4,f5
  35.         }
  36. }
复制代码
效率测试:
  1. [root@localhost ~]# time ./a > a.r

  2. real    1m43.244s
  3. user    0m1.535s
  4. sys     0m1.153s
  5. [root@localhost ~]# wc a.r
  6.    202    806 297136 a.r
  7. [root@localhost ~]# time ./p > p.r

  8. real    1m40.743s
  9. user    0m0.251s
  10. sys     0m0.036s
  11. [root@localhost ~]# wc p.r
  12.   202   806 84208 p.r
  13. [root@localhost ~]#
复制代码
从上面的数据可知,awk的效率不比perl低。
   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
20 [报告]
发表于 2014-04-01 15:27 |只看该作者
回复 18# bikkuri

从我19楼的效率测试你应该知道我是怎么重定向的了吧?
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP