Kolakoski 序列是一个仅由1和2组成的无限数列,是一种通过“自描述”来定义的数列。
Kolakoski 序列是一个分形数列:如果将相邻相同的数字组成一组,那么...
如果把每一组数用它的长度来替换,就会得到这个数列本身。
Kolakoski 序列前几项为:1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1,2,...
( sequence A000002 in the OEIS )
DNA序列的构成基于四种特定的碱基,分别是腺嘌呤(A)、胸腺嘧啶(T)、鸟嘌呤(G)和胞嘧啶(C)。这些碱基以特定的配对方式形成碱基对,即A与T配对,C与G配对,这是基于它们之间的氢键相互作用。每个碱基代表一个特定的遗传信息,通过这些碱基的排列顺序,DNA序列能够编码遗传信息,进而指导生物体的生长、发育和功能。(在RNA序列中,U取代了DNA序列中的T)
1990年日本学者间中喜雄将嘌呤类假定为阴(A 太阴 和 G 少阴),嘧啶类假定为阳(T 太阳 和 C少阳),应用到遗传密码表中解读易学,结果表示氨基酸的三联体惊人地与“易经八卦”相对应。
假设 1为阳爻,2为阴爻,那么可以转换为DNA序列。
编写 kolakoski-DNA.py 如下
# -*- coding: utf-8 -*-
""" Kolakoski序列是一个仅由1和2组成的无限数列,是一种通过“自描述”来定义的数列。
Kolakoski序列是一个分形数列。
"""
n = 100
alist = [1,2,2]
prev = 2
tail = 3
a = 1
while tail < n:
for i in range(0,alist[prev]):
alist.append(a)
tail += 1
a = a^3 # 按位异或
prev += 1
# 输出 Kolakoski序列
#print(alist)
blist = []
b = 0
for i in range(0,n):
if i %2 == 0:
b = alist[i]*10
else:
b += alist[i]
blist.append(b)
# 输出每2位数,组成一组
print(blist)
clist = []
for b in blist:
if b == 11:
clist.append('T')
elif b == 12:
clist.append('C')
elif b == 21:
clist.append('G')
elif b == 22:
clist.append('A')
else:
clist.append('?')
# 输出 伪造DNA序列
print(clist)
print(''.join(clist))
# 输出每3位一组
for i in range(0, len(clist)):
if i %3 == 0 and i >0:
print(',', end='')
print(clist[i], end='')
运行 python kolakoski-DNA.py
[12, 21, 12, 12, 21, 22, 11, 21, 12, 21, 21, 12, 12, 21, 12, 11, 21, 22, 12, 21, 12, 12, 21, 21, 12, 11, 22, 12, 21, 12, 12, 21, 22, 11, 21, 12, 12, 21, 21, 12, 21, 22, 11, 21, 22, 12, 21, 12, 11, 22]
['C', 'G', 'C', 'C', 'G', 'A', 'T', 'G', 'C', 'G', 'G', 'C', 'C', 'G', 'C', 'T', 'G', 'A', 'C', 'G', 'C', 'C', 'G', 'G', 'C', 'T', 'A', 'C', 'G', 'C', 'C', 'G', 'A', 'T', 'G', 'C', 'C', 'G', 'G', 'C', 'G', 'A', 'T', 'G', 'A', 'C', 'G', 'C', 'T', 'A']
CGCCGATGCGGCCGCTGACGCCGGCTACGCCGATGCCGGCGATGACGCTA
CGC,CGA,TGC,GGC,CGC,TGA,CGC,CGG,CTA,CGC,CGA,TGC,CGG,CGA,TGA,CGC,TA