我正在尝试提出一种好的算法,以任意数量的字符使用破折号创建带有主要和次要凹槽的right handed DNA字符串的表示形式。

这是我目前所拥有的,使用776 #:

  #########                 ##########
    #########                ##########
      #########              ##########
        #########          ##########
          ##########     ##########
            ########## ##########
              ###### ##########
                ## ##########
                 ########## #
               ########## #####
             ########## #########
           ##########    ##########
         ##########        ##########
       ##########           ##########
     ##########             ##########
   ##########               ##########
  ##########               ##########
  ##########             ##########
  ##########           ##########
   ##########        ##########
     ###########   ##########
       ######### ##########
         ##### ##########
           # ##########
           ########## ###
         ########## #######
       ##########  ##########
     ##########      ##########
   ##########          ##########
  ##########             ##########
  ##########               ##########
  ##########                 ##########
   ##########                 ##########
     ##########               ##########
       ##########             ##########
         ##########          ##########
           ##########      ##########
             ##########  ##########
               ####### ##########
                 #### #########
                    ######### #
                  ########## ###
                ########### #######

但是当我手动尝试通过复制/粘贴重复螺旋时,螺旋无法完全对齐。

具有与上面示例相同的宽度但又具有碱基对交叉键(如this image或下面的围巾图案)的解决方案也是可以接受的。

最佳答案

这个问题的关键是要认识到,您可以将螺旋上的每条链表示为正弦波的组合-一个代表周期部分,另一个代表进入页面的“深度”。通过这种方式对问题进行参数化设置后,就可以控制螺旋线的各个方面。下面的示例使用*#来显示不同的线来说明该点。如果您选择的波长值与整数值不相称,您得到的结果将少于最佳结果-但是现在您可以使用输入来查找您认为最美观的表示形式。

from numpy import *

amp = 10
length = 100
wavelength = 20

omega = (2*pi)/wavelength
phi   = wavelength*(0.5)
X = arange(1,length)
Y1 = round_(amp*(sin(omega*X) + 1))
Y2 = round_(amp*(sin(omega*X+phi) + 1))

offset = phi/2
Z1 = sin(omega*X + offset)
Z2 = sin(omega*X + phi + offset)

T1 = " ######### "
T2 = " ********* "
clen = len(T1)

H = zeros((length,amp*2+clen),dtype='str')
H[:,:] = " "

for n,(y1,y2,z1,z2) in enumerate(zip(Y1,Y2,Z1,Z2)):
    H[n,y1:y1+clen] = list(T1)
    H[n,y2:y2+clen] = list(T2)

    # Overwrite if first helix is on top
    if z1>z2: H[n,y1:y1+clen] = list(T1)

for line in H:
    print "".join(line)

这些值给出:

   *********  #########
  *********      #########
 *********         #########
 *********           #########
   *********         #########
     *********       #########
       *********   #########
          ****** #########
              #########
           ######### ****
        #########  *********
     #########      *********
   #########         *********
 #########           *********
 #########         *********
 #########       *********
   #########   *********
     ###### *********
        *********
      ********* ####
   *********  #########
  *********      #########
 *********         #########
 *********           #########
   *********         #########
     *********       #########
       *********   #########
          ****** #########
              #########

关于python - 双螺旋生成算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10282693/

10-11 12:17