免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 5523 | 回复: 26
打印 上一主题 下一主题

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

论坛徽章:
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
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-31 18:45 |只看该作者 |倒序浏览
本帖最后由 bikkuri 于 2014-04-01 11:08 编辑

我们用以下4个字符/字符串来表示细胞的生命周期:
o -> 0 -> 8 -> oo
幼年期 -> 成年期 -> 分裂期 -> 两个幼体
以一秒代表一年,其中在各个生命周期中的细胞在一年中可能的变化如下:
幼年期:
1/10的概率死亡 o -> .
4/5的概率长大 o -> 0
1/10的概率不变 o -> o
成年期:
1/10的概率死亡 0 -> .
4/5的概率分裂 0 -> 8
1/10的概率不变 0 -> 0
分裂期:
1/10的概率死亡 8 -> .
4/5的概率分裂成功 8 -> oo
1/10的概率单个死亡 8 -> o.
死亡后的.在下一年中仍保留但不做任何变化。
请用shell写一个细胞分裂的世代推演脚本,每秒产生一行输出,直到第100行或者全部细胞死亡,并计算出各世代中各生命状态包括死亡的细胞的数量。
[1]        o
[2]        0
[3]        8
[4]        oo
[5]        o0
[6]        08
[7]        8oo
...
[100]        0oo8o.80..8.oo0.8oo
---------------------------
        [.]        [o]        [0]        [8]        [.o08]
[1]:        0        1        0        0        1
[2]:        0        0        1        0        1
[3]:        0        0        0        1        1
[4]:        0        2        0        0        2
[5]:        0        1        1        0        2
[6]:        0        0        1        1        2
[7]:        0        1        1        1        3
...
[100]:        5        7        3        4        20

论坛徽章:
3
水瓶座
日期:2014-02-20 12:02:14天蝎座
日期:2014-03-19 14:04:46水瓶座
日期:2014-07-26 20:01:02
2 [报告]
发表于 2014-03-31 20:11 |只看该作者
这个严重烧脑汁,收藏一下,看哪位大神出手。

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
3 [报告]
发表于 2014-03-31 20:45 |只看该作者
回复 1# bikkuri
  1. awk 'BEGIN{srand();b["o-1"]=".";b["o-2"]="0";b["o-3"]="o";b["0-1"]=".";b["0-2"]="8";b["0-3"]="0";b["8-1"]=".";b["8-2"]="oo";b["8-3"]="o.";p="o";while(i++<100){print i,p;t="";cmd="sleep 1";system(cmd);close(cmd);for(n=1;n<=split(p,x,"");n++){if(x[n]!="."){t=t b[x[n]"-"int(1+3*rand())];}else{t=t"."}};if(t~/^\.*$/){print i+1,t;exit};p=t}}'
复制代码

论坛徽章:
0
4 [报告]
发表于 2014-03-31 23:15 |只看该作者
回复 1# bikkuri
存活率低, 成长率更低.
  1. #!/bin/sh
  2. eve[0]='o'
  3. eve[1]='0'
  4. eve[2]='8'
  5. eve[4]='.'
  6. eve[5]='.'
  7. eve[6]=''
  8. c[0]=0
  9. c[1]=6
  10. expire=0
  11. function division(){
  12.     if [ ${c[$1]} -gt 3 ];then
  13.         let c[$1]=c[$1]+1
  14.         return 0
  15.     fi
  16.     case `expr $RANDOM % 3` in
  17.         0)
  18.             c[$1]=4
  19.             let expire=expire+1
  20.             return 0
  21.             ;;
  22.         1)
  23.             let c[$1]=c[$1]+1
  24.             if [ ${c[$1]} -eq 3 ];then
  25.                 c[$1]=0
  26.                 c[$1+1]=0
  27.             fi
  28.             return 0
  29.             ;;
  30.         2)
  31.             let c[$1]=c[$1]%2
  32.             return 0
  33.             ;;
  34.         *)
  35.             exit 1
  36.             ;;
  37.     esac
  38. }
  39. function output(){
  40.     printf "%d\t" $1
  41.     string=`printf "%d" ${c[@]}|sed "s/0/${eve[0]}/g;s/1/${eve[1]}/g;s/2/${eve[2]}/g;s/4/${eve[4]}/g;s/5/${eve[5]}/g;s/6/${eve[6]}/g"`
  42.     printf "%s\n" "$string"
  43.     return 0
  44. }
  45. function extract(){
  46.     num=`printf "%d" ${c[@]}|sed 's/[^'"$1"']//g'`
  47.     printf "%d" ${#num}
  48.     return 0
  49. }
  50. function statistic(){
  51.     printf '%s\n' "---------------------"
  52.     printf "%c:\t%d\n" ${eve[4]} $expire
  53.     printf "%c:\t%d\n" ${eve[0]} `extract 0`
  54.     printf "%c:\t%d\n" ${eve[1]} `extract 1`
  55.     printf "%c:\t%d\n" ${eve[2]} `extract 2`
  56.     exit 0
  57. }
  58. function reorg(){
  59.     printf "%d" ${c[@]}|grep '^6*>/dev/null&&statistic
  60.     c=(`printf "%d" ${c[@]}|sed 's/6//g;s/[0-5]/& 6 /g'`)
  61.     return 0
  62. }

  63. #Main
  64. output 1
  65. for i in `seq 2 100`
  66. do
  67. #    sleep 1
  68.     max=`expr ${#c[@]} - 1`
  69.     for j in `seq 0 2 $max`
  70.     do
  71.         division $j
  72.     done
  73.     reorg
  74.     output $i
  75. done
  76. statistic
复制代码

论坛徽章:
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
5 [报告]
发表于 2014-03-31 23:51 |只看该作者
原来一个细胞想存活下来并分裂是那么不容易的~
  1. #!/usr/bin/perl
  2. use 5.010;
  3. my $cell = "o";
  4. my $count = 0;
  5. while ( $count < 100 ) {
  6.         my @cells = $cell =~ /./g;
  7.         for my $i ( 0 .. $#cells ) {
  8.                 given ( rand() ) {
  9.                         when ( $_ < 1/3 ) { $cells[$i] = "." }
  10.                         when ( $_ < 2/3 ) { $cells[$i] = "o." if $cells[$i] eq "8" }
  11.                         default {
  12.                                 given ( $cells[$i] ) {
  13.                                         when ( "o" ) { $cells[$i] = "0" }
  14.                                         when ( "0" ) { $cells[$i] = "8" }
  15.                                         when ( "8" ) { $cells[$i] = "oo" }
  16.                                 }
  17.                         }
  18.                 }
  19.         }
  20.         $cell = join "", @cells;
  21.         say join "\t", ++$count, $cell;
  22.         $cell =~ /^\.+$/ && exit;
  23.         sleep 1;
  24. }
复制代码

论坛徽章:
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
6 [报告]
发表于 2014-04-01 00:19 |只看该作者
本帖最后由 bikkuri 于 2014-04-01 02:06 编辑

谢谢大家的回复。
看来死亡率是设置得太高了,而成长率则显得太低了,所以细胞还来不及成长及分裂就死光了。
假如我们把死亡率降低到1/5,而成长率提高到3/5再看看?
大家的脚本都很精彩,但是能把后面一个要求也实现吗?
即在世代推演结束后计算出各世代中各生命状态包括死亡的细胞的数量。
谢谢。

论坛徽章:
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
7 [报告]
发表于 2014-04-01 01:46 |只看该作者
本帖最后由 bikkuri 于 2014-04-01 08:32 编辑

在您的代码基础上稍微做了下修改:

  1. awk 'BEGIN{srand();b["o-1"]=".";b["o-2"]="0";b["o-3"]="o";b["0-1"]=".";b["0-2"]="8";b["0-3"]="0";b["8-1"]=".";b["8-2"]="oo";b["8-3"]="o.";p="o";while(i++<100){print i,p;t="";cmd="sleep 1";system(cmd);close(cmd);for(n=1;n<=split(p,x,"");n++){if(x[n]!="."){t=t b[x[n]"-"int(sqrt(1+5*rand()))+1];}else{t=t"."}};if(t~/^\.*$/){print i+1,t;exit};p=t}}'
复制代码
现在应该不会出现全部细胞死亡的情况了。
但是。。。但是。。。但是。。。
到第45代左右细胞数量猛增。。。
在我的busybox上第50代的时候运行速度就很慢了。。。
到Linux上第70代以后运行速度也很慢了。。。
不过满屏幕都是.o08。。。好壮观!
所以为了避免世代80和88和细胞的输出混淆,希望在世代编号前后加括号[]。
比如:
[1] o
[2] 8
[3] oo
在linux上计算第90代需要3分钟,目测等到算完第100代至少还要半个多小时。。。
到第92代已经有20695个细胞了。。。但是活细胞和死细胞的数量不明。。。
  1. [test@hp:~]$ sed -n 92p cell.txt |wc
  2.       1       2   20698
复制代码
呼~第93代。。。
  1. [test@hp:~]$ sed -n 93p cell.txt |wc
  2.       1       2   23110
复制代码
第94代。。。
  1. [test@hp:~]$ sed -n 94p cell.txt |wc
  2.       1       2   25764
复制代码
第95代花了10分钟。。。
  1. [test@hp:~]$ sed -n 95p cell.txt |wc
  2.       1       2   28808
复制代码
仔细想了一下,int(sqrt(1+5*rand()))+1好像不对,应该是int(sqrt(5*rand()))+1,算了,睡了。。。明天早上再来看结果。。。
int(sqrt(1+5*rand()))+1的话,死亡率/成长率/不变率实际上是0,1/5,4/5。
也就是说,不论是幼体细胞还是成体细胞都不会死,而细胞分裂的时候单个死亡率非常高,几乎是只要分裂必死一个。
这好象也不太符合实际情况。
但是刚才又试了一下int(sqrt(5*rand()))+1,即死亡率/成长率/不变率为1/5,3/5,1/5,还是很快就全部死光了。看来1/5的死亡率还是太高了。
等下再试试1/100,81/100,18/100。不过目测这个比例产生的细胞数会比昨天晚上的更多。
回复 3# yinyuemi


   

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
8 [报告]
发表于 2014-04-01 04:28 |只看该作者
看了一下大家的思路,这个题有没可能按照3进制来计算。 三个状态,幼年期,成年期,分裂期 分别为 0,1,2 ,死亡为特殊状态。不变就是加零,分裂或成长就是加一。

论坛徽章:
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
9 [报告]
发表于 2014-04-01 10:03 |只看该作者
回复 7# bikkuri

你这脚本的死亡率应该不是1/5吧,我把我那脚本改为1/5,死亡率依旧很高,改成1/10才能存活到第100年~
   

论坛徽章:
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
10 [报告]
发表于 2014-04-01 11:28 |只看该作者
本帖最后由 bikkuri 于 2014-04-01 11:29 编辑

死亡率/成长率/不变率分别为0.1/0.8/0.1的版本:
  1. awk 'BEGIN{srand();b["o-1"]=".";b["o-2"]="0";b["o-3"]="o";b["0-1"]=".";b["0-2"]="8";b["0-3"]="0";b["8-1"]=".";b["8-2"]="oo";b["8-3"]="o.";p="o";while(i++<100){print i,p;t="";cmd="sleep 1";system(cmd);close(cmd);for(n=1;n<=split(p,x,"");n++){if(x[n]!="."){r=rand();if(r<0.1){j=1}else if(r<0.9){j=2}else{j=3};t=t b[x[n]"-"j];}else{t=t"."}};if(t~/^\.*$/){print i+1,t;exit};p=t}}'
复制代码
感觉这个比率输出的图形比昨天晚上的有规律多了。。。
另外有谁能把各世代中各生命状态包括死亡的细胞的数量算出来啊。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP