好久没上CSDN了噢,今天觉得无论如何得学一下python了,捣鼓了一晚,好弱啊~~ 在这贴个代码,以备忘。
----------------------------------
题外话:这学期要设计基于FPGA的CPU,我组设计很大程度参考MIPS架构,发现UCB 61C的CPU设计部分的课件(注:itunes U是有视频的,不过看视频比较耗时。。)还是很给力的哈哈。进一步发掘资料,发现还有很多好资源哈哈。其中SelfPace Course就是非常好的资源,建议CSDN的朋友们多看看。这学期还有在做编译器实现(系里采用的是stanford 的cool 语言方案 CS143)和B/S的数据库应用系统的专题实验,有在做相关东西的同学大家多交流。
---------------------------------
UCB SelfPace课程
http://www-inst.eecs.berkeley.edu/~selfpace/cs9honline/P1/
UCB Selfpace course: python for
Project 1: Cellular Automaton
author: JRH @XJTU
2012-3-25
s=
''
times= 50
ruleNumber= 30
def D2Binary8bit(i):
def Denary2Binary(n):
bStr= ''
if n== 0: return '0'
while n> 0:
bStr= str(n% 2)+bStr
n=n>> 1
return bStr
def plusZero(s):
while 8- len(s)> 0:
s= '0'+s
return s
s=Denary2Binary(i)
strTemp=plusZero(s)
#print i
return strTemp
ruleBinary=D2Binary8bit(ruleNumber)
#print "ruleBinary is"
#print ruleBinary
def rule(bit1,bit2,bit3):
if bit1== 1 and bit2== 1 and bit3== 1: return ruleBinary[ 0]
if bit1== 1 and bit2== 1 and bit3== 0: return ruleBinary[ 1]
if bit1== 1 and bit2== 0 and bit3== 1: return ruleBinary[ 2]
if bit1== 1 and bit2== 0 and bit3== 0: return ruleBinary[ 3]
if bit1== 0 and bit2== 1 and bit3== 1: return ruleBinary[ 4]
if bit1== 0 and bit2== 1 and bit3== 0: return ruleBinary[ 5]
if bit1== 0 and bit2== 0 and bit3== 1: return ruleBinary[ 6]
if bit1== 0 and bit2== 0 and bit3== 0: return ruleBinary[ 7]
def update():
temp= ''
temp=temp+ '1'
global times
global s
each= 2
while each<times* 2+ 1:
temp = temp+ str(rule( int(s[each- 2]), int(s[each- 1]), int(s[each])))
each+= 1
temp=temp+ '1'
s=temp
return temp
def ini() :
t= 0
global s
while t< times* 2+ 1:
if t==times:
s+= '1'
t+= 1
else:
s+= '0'
t+= 1
print s
def main():
print "P1", times* 2 + 1,times+ 1
ini()
index= 0
while index < times:
print update()
index+= 1
if __name__== '__main__':main()
times= 50
ruleNumber= 30
def D2Binary8bit(i):
def Denary2Binary(n):
bStr= ''
if n== 0: return '0'
while n> 0:
bStr= str(n% 2)+bStr
n=n>> 1
return bStr
def plusZero(s):
while 8- len(s)> 0:
s= '0'+s
return s
s=Denary2Binary(i)
strTemp=plusZero(s)
#print i
return strTemp
ruleBinary=D2Binary8bit(ruleNumber)
#print "ruleBinary is"
#print ruleBinary
def rule(bit1,bit2,bit3):
if bit1== 1 and bit2== 1 and bit3== 1: return ruleBinary[ 0]
if bit1== 1 and bit2== 1 and bit3== 0: return ruleBinary[ 1]
if bit1== 1 and bit2== 0 and bit3== 1: return ruleBinary[ 2]
if bit1== 1 and bit2== 0 and bit3== 0: return ruleBinary[ 3]
if bit1== 0 and bit2== 1 and bit3== 1: return ruleBinary[ 4]
if bit1== 0 and bit2== 1 and bit3== 0: return ruleBinary[ 5]
if bit1== 0 and bit2== 0 and bit3== 1: return ruleBinary[ 6]
if bit1== 0 and bit2== 0 and bit3== 0: return ruleBinary[ 7]
def update():
temp= ''
temp=temp+ '1'
global times
global s
each= 2
while each<times* 2+ 1:
temp = temp+ str(rule( int(s[each- 2]), int(s[each- 1]), int(s[each])))
each+= 1
temp=temp+ '1'
s=temp
return temp
def ini() :
t= 0
global s
while t< times* 2+ 1:
if t==times:
s+= '1'
t+= 1
else:
s+= '0'
t+= 1
print s
def main():
print "P1", times* 2 + 1,times+ 1
ini()
index= 0
while index < times:
print update()
index+= 1
if __name__== '__main__':main()
-----------------------------------
对times和ruleNumber变量进行修改,可以得到不同规则(ruleNumber)下不同迭代次数(times)的结果:
如将times=3 , ruleNumber=30,本程序输出为:
P1 7 4
0001000
1011101
1010001
1011011
程序输出为这样的格式,只要利用linux 的 > 到bpm文件(Portable Bitmap),即可制作一副由该Cellular Automaton 产生的图像了。下面简要介绍一下bpm:
Portable Bitmap Format 例如,一个7*3 的bpm图像
第一行内容: P1 宽 长
P1 7 3
0001000
0011100
0110010
---
下面将程序的输出重定向到 rule30.bpm文件中:
$ python project1.py > rule30.pbm
成功后即可用一般的图像查看软件查看该图像了。 还可有修改times和ruleNumber,产生更多图案。更多Cellular Automaton 内容,请参考http://atlas.wolfram.com/TOC/