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

[技术讨论] 细胞自动机Python脚本运行到最后都稳定在一个状态不变了,高手给看看算法对不对

  1. import random
  2. import os
  3. import time
  4. def init(level):
  5.     return random.randint(0,level)
  6. dict={' ':0,'●':1}
  7. cells=[[' ' for x in range(32)] for y in range(22)]
  8. grid=[[' ' for x in range(32)] for y in range(22)]
  9. while True:
  10.     level=input('larger number,less cells (>0):')
  11.     try:
  12.         if int(level)>0:
  13.             for y in range(1,21):
  14.                 for x in range(1,31):
  15.                     r=random.randint(0,int(level))
  16.                     if r==0:cells[y][x]='●'
  17.             break
  18.     except:pass
  19. for y in cells:print(' '.join(y))
  20. print("press key to begin...")
  21. os.system('pause >nul')
  22. i=0
  23. while True:
  24.     for y in range(1,21):
  25.         for x in range(1,31):
  26.             num=dict[cells[y-1][x-1]]+\
  27.                 dict[cells[y-1][x+1]]+\
  28. dict[cells[y-1][x]]+\
  29. dict[cells[y+1][x-1]]+\
  30. dict[cells[y+1][x+1]]+\
  31. dict[cells[y+1][x]]+\
  32. dict[cells[y][x-1]]+\
  33. dict[cells[y][x+1]]
  34.             if num==3:grid[y][x]='●'
  35.             elif num==2:grid[y][x]=cells[y][x]
  36.             elif num :grid[y][x]=' '
  37.     for y in range(1,21):
  38.         for x in range(1,31):
  39.             cells[y][x]=grid[y][x]
  40.     time.sleep(0.05)
  41.     os.system('cls')
  42.     i+=1
  43.     print('time: '+str(i))
  44.     for y in cells:print(' '.join(y))
复制代码
这是出生概率为33%时的稳定状态,基本不变了,个别在动

概率50%的

如果要把这个脚本用迭代函数或者生成器写出来,该怎么改啊,加上是二维数组我更不会写了
!scripting!

回复 34# 523066680


    你猜错鸟,今年不回去~

TOP

本帖最后由 523066680 于 2014-10-1 19:03 编辑

回复 33# CrLf

no, no, no  看我设定的下标
另,
    还有个方法,发到perl区了


看来已经回到老家了,还上论坛巡查,真敬业。

TOP

回复 30# 523066680


    手机上看的,忘了回
    ($ar, $br) = ($br, $ar); 是个好办法
    (@a[0..$#b], @b[0..$#a]) = (@b, @a); 就只能适用于元素个数相等的特殊情况了,感觉还不如用临时变量

TOP

回复 31# 523066680

链接地址多了个点号,   点击不开

TOP

本帖最后由 523066680 于 2014-10-1 18:23 编辑

回复 27# 普大喜奔


    :new gun:  An old name for the second known basic {gun} (found, like
   the first, by Bill Gosper), shown below.  A number of other ways of
   constructing a gun from two {twin bees shuttle}s have since been
   found - see {edge shooter} for one of these.

来源:
LIFE LEXICON
  Release 25, 2006 February 28
  ASCII version

INTRODUCTION
  This is a lexicon of terms relating to John Horton Conway's
Game of Life.  It is also available in single-page and multipage
HTML versions.
  This lexicon was compiled by Stephen A. Silver - see
below for additional credits.  I can be contacted at
life(at)argentum.freeserve.co.uk.
  The latest versions of this lexicon (both HTML and ASCII)
should be available from the Life Lexicon Home Page at
http://www.argentum.freeserve.co.uk/lex_home.htm

TOP

本帖最后由 523066680 于 2014-10-1 18:26 编辑

回复 28# CrLf


      居然不理我

还有个"正确"方法,发到Perl区了。

TOP

本帖最后由 523066680 于 2014-9-30 12:05 编辑

回复 28# CrLf


      因为引用是一个地址,\@a = \@b 就是地址=地址,就那啥了……
只能是 变量名 = 引用地址

可以这么做,一开始就用引用对数组操作比如:
      ($ar, $br) = (\@a, \@b);
用 $ar->[下标] 的方式访问元素,用 @{$ar} 的方式访问整个数组
交换的时候也就和标量交换一样了。
      ($ar, $br) = ($br, $ar);


经过思考,发现可以这样(其实是在Perl高效编程里面看过这样的用法:片段赋值)
  1. my @a=1..5;
  2. my @b=6..10;
  3. (@a[0..$#b], @b[0..$#a]) = (@b, @a);
复制代码
这样的话指定了长度,列表元素自然对号入座,嘿嘿。

TOP

本帖最后由 CrLf 于 2014-9-30 00:52 编辑

回复 11# 523066680


想请教个问题,perl 可以用列表直接交换变量值:
  1. $a=1;
  2. $b=2;
  3. ($a,$b)=($b,$a);
  4. print "\$a=$a;\$b=$b;"
复制代码
数组肯定不能直接用 (@a,@b)=(@b,@a),但为什么改成引用就报错?是否是只有在调用函数时可以用 \@ 呢?一对数组、列表、hash 表是不是无法直接交换内容呢?
  1. @a=1..3;
  2. @b=4..5;
  3. (\@a,\@b)=(\@b,\@a);
  4. print "@a";
复制代码

TOP

回复 20# 523066680
版主这个模型叫什么来着
!scripting!

TOP

回复 11# 523066680


浅拷贝/深拷贝,不过话说回来深拷贝的效率确实不如用俩数组将就了(泥们就是这么干的!魂淡!),反正脚本也不大

TOP

回复 22# 普大喜奔


高宽各 1000,这样够大了吧,超出屏幕部分得拉动滚动条查看...
  1. mode con:cols=1000 lines=1000
复制代码
再将置字体为 3*5 大小,就能显示不少东西了

TOP

回复 20# 523066680
才发现cmd原来可以设置的
!scripting!

TOP

回复 21# CrLf
高手就是高手 我的理解有问题 我以为num只要不为空就成立了 忘了0也是 C语言没学好
!scripting!

TOP

回复 20# 523066680
读入应该不难 难的是cmd窗口太小了 cmd30列就到头了 行只有20左右 难不成再学下GUI!版主有没有好办法教教小弟
!scripting!

TOP

返回列表