您的代码将永远生成DNA的非常简单的ASCII表示形式。它会以您想要的任何格式将两个数字作为输入:作为列表,作为函数的参数,在stdin等上。
I
介于0.0到1.0(含)之间的浮点间隔(以秒为单位)- 缩放级别
Z
,从1到64(含)的整数
您的代码将每秒钟将一行输出到stdout或等价的行,从而I
产生一个无限的输出,看起来像这样(缩放级别4):
A
T-----a
G-------c
G-----c
g
t-----A
a-------T
c-----G
T
A-----t
C-------g
...
具体地,我们的DNA的表示是一对由连字符连接的正弦波,一个由字符a
,c
,g
,和t
,其他字符的A
,C
,G
,和T
。如果x
是我们当前正在打印的行的0索引编号,则小写波中字符的从0开始的位置由给出(sin(πx / Z) + 1) * Z
,而大写波中的字符从0开始的位置由给出(-sin(πx / Z) + 1) * Z
,两者都四舍五入(但没有下限)整数。更多细节:
- 如果两个波浪重叠,则需要从大写波浪开始,交替选择哪个波浪在前面。(从小写波开始,我们会得到一个不存在的双螺旋!)
- 忽略大小写,A总是与T配对,C总是与G配对,就像在真实的DNA中一样。线对本身应随机选择,并在四种可能性上均匀分布。在代码的连续运行中,对的选择是相同还是不同并不重要。只要输出没有明显的模式并且周期至少在十亿之内,随机选择的统计质量就不成问题了(像RANDU这样有缺陷的PRNG 很好。)
- 您必须没有尾随空格,或者必须在该缩放级别将每一行都填充到波浪的最大位置(在上面的示例中为九个字符)。出于数学原因,缩放级别1可能有一个可选的附加尾随空格。
由于DNA很小,因此您的代码将需要尽可能短。
更多示例:
缩放等级8:
T
C-----g
A-----------t
C-------------g
G---------------c
T-------------a
T-----------a
T-----a
c
g-----C
t-----------A
g-------------C
a---------------T
...
缩放等级2:
A
T---a
c
g---C
G
A---t
c
a---T
...
缩放级别1(注意前导空格):
G
a
C
t
...