DNA:脱氧核糖核酸ASCII


22

给定碱基序列腺嘌呤,胞嘧啶,鸟嘌呤和胸腺嘧啶(编码为ACGT),您将产生相应DNA双链的ASCII艺术表示。

股线将垂直延伸。左侧的链是您输入的链。右手链将为其补充。对于不熟悉DNA的人,ATC配对G。此外,双链的每一侧都具有骨架结构,该骨架结构对于所有碱基都是相同的。因此,如果提供输入TAGCAT,则ASCII艺术的大规模结构将是:

BTAB
BATB
BGCB
BCGB
BATB
BTAB

其中B代表骨干。现在这些字母代表一个完整的分子,您将重现实际的分子结构

基地

对每个碱基使用以下模板1(每个碱基与其互补碱基和两个主链分子一起显示):

1感谢Peter Taylor提供的ASCII布局帮助。

腺嘌呤

 O    O
  \\ /
    P
   / \
--O   O
     /                                         |
    <            N      NH2 ..... O      *     |
     \         // \    /           \\   /      |
      +--O    //   ----             ----       |
      |   \   |   //  \\           /   \\      |
      |    >--N--<      N ...... HN      >  ---+
      |   /       \    /           \    /  /   |
      +---         N===             ---N--<    |
      |                            //      \   |
      |                           O         O--+
      |                                         \
      |                                          >
      |                                         /
                                               O   O--
                                                \ /
                                                 P
                                                / \\
                                               O    O

胞嘧啶

 O    O
  \\ /
    P
   / \
--O   O            NH2 ..... O      N
     /            /           \\   / \\        |
    <         ----             ----   \\    ---+
     \       //  \\           /   \\   |   /   |
      +--O  <      N ...... HN      >--N--<    |
      |   \  \    /           \    /       \   |
      |    >--N---             ===N         O--+
      |   /      \\           /                 \
      +---         O ..... H2N                   >
      |                                         /
                                               O   O--
                                                \ /
                                                 P
                                                / \\
                                               O    O

鸟嘌呤

 O    O
  \\ /
    P
   / \
--O   O
     /                                         |
    <            N      O ..... H2N            |
     \         // \   //           \           |
      +--O    //   ----             ----       |
      |   \   |   //   \           //  \\      |
      |    >--N--<      NH ...... N      >  ---+
      |   /       \    /           \    /  /   |
      +---         N===             ---N--<    |
      |                \           //      \   |
      |                 NH2 ..... O         O--+
      |                                         \
      |                                          >
      |                                         /
                                               O   O--
                                                \ /
                                                 P
                                                / \\
                                               O    O

胸腺嘧啶

 O    O
  \\ /
    P
   / \
--O   O     *      O ..... H2N      N
     /       \   //           \    / \\        |
    <         ----             ----   \\    ---+
     \       //   \           //  \\   |   /   |
      +--O  <      NH ...... N      >--N--<    |
      |   \  \    /           \    /       \   |
      |    >--N---             ===N         O--+
      |   /      \\                             \
      +---         O                             >
      |                                         /
                                               O   O--
                                                \ /
                                                 P
                                                / \\
                                               O    O

构造双链

这些在垂直方向上重复,因此主干结构中没有间隙。这意味着这四个模板的边界框将重叠。

右骨干的左侧和顶端的底端将连接到OOH

自由O在正确的骨干的离开和底端的顶端将有一个免费的债券会向内,以表示--

ATG

 O    O--
  \\ /
    P
   / \
--O   O                                        OH
     /                                         |
    <            N      NH2 ..... O      *     |
     \         // \    /           \\   /      |
      +--O    //   ----             ----       |
      |   \   |   //  \\           /   \\      |
      |    >--N--<      N ...... HN      >  ---+
      |   /       \    /           \    /  /   |
      +---         N===             ---N--<    |
      |                            //      \   |
      |                           O         O--+
      |                                         \
      |                                          >
      |                                         /
 O    O                                        O   O--
  \\ /                                          \ /
    P                                            P
   / \                                          / \\
--O   O     *      O ..... H2N      N          O    O
     /       \   //           \    / \\        |
    <         ----             ----   \\    ---+
     \       //   \           //  \\   |   /   |
      +--O  <      NH ...... N      >--N--<    |
      |   \  \    /           \    /       \   |
      |    >--N---             ===N         O--+
      |   /      \\                             \
      +---         O                             >
      |                                         /
 O    O                                        O   O--
  \\ /                                          \ /
    P                                            P
   / \                                          / \\
--O   O                                        O    O
     /                                         |
    <            N      O ..... H2N            |
     \         // \   //           \           |
      +--O    //   ----             ----       |
      |   \   |   //   \           //  \\      |
      |    >--N--<      NH ...... N      >  ---+
      |   /       \    /           \    /  /   |
      +---         N===             ---N--<    |
      |                \           //      \   |
      |                 NH2 ..... O         O--+
      |                                         \
      |                                          >
      |                                         /
      OH                                       O   O--
                                                \ /
                                                 P
                                                / \\
                                             --O    O

更多示例:

以下是更多示例的MD5哈希值(没有多余的前导或尾随空格):

ATG      2e4a906c44a96fe84134bf4346adf11c (this is the above example)
C        e3648b8960967463784818c3eee57246
TTT      6028a90b05775905ef1a00e7a45463c5
TAGCAT   3b834d2b7b9adc4113ffabd52d354c41
GATTACA  a19463f965c641d071e07da59d64a418

让我知道您是否认为其中任何一个错误。

如果不确定如何可靠地检查结果的哈希值,请尝试使用此在线MD5生成器。确保没有尾随换行符。

进一步说明

可以根据需要使用前导或尾随空格。当然,如果使用前导空格,则每行中的空格数量必须相同。

如果我在复制化学结构时遇到任何错误,则上述模板对于本挑战而言仍是规范性的。

您可以编写通过STDIN 将输入字符串作为参数,命令行参数的函数或程序,或者希望将其存储在变量中。将生成的ASCII文字写入STDOUT。

这是代码高尔夫球,因此最短的答案(以字节为单位)获胜。


惊人的挑战!

9
应该要求加塔加(GATTACA)
凯文(Kevin)

1
@Kevin我以前甚至都考虑过,所以现在添加了它。;)我还修复了哈希,TTT因为该字符串包含尾随换行符。
马丁·恩德

如何获得md5校验和?我复制了您的ATG输出,并得到了不同的校验和。并且不同的操作系统将获得不同的校验和。您可以尝试使用unix2dos, unix2mac...

@Ray我使用Digest::MD5.hexdigest()带有Unix样式行尾的Ruby来获取它们。而且,它们都没有尾随换行符。将其粘贴到此处 -此在线MD5生成器同意我的哈希值。
Martin Ender 2014年

Answers:


2

Perl 5(510)

Perl可以使用空字节,所以请使用提供的hexdump来运行它。

这是通过打印出DNA链的不同部分而起作用的,其中一部分是一个或多个行。O或H附加到每个组件的顶行,以确保有效输出。

假设输入在变量中$_

高尔夫球版:

use Compress::Zlib;@f=(eval uncompress q+xœÍUËnà ¼ó{³””¬”slqäù |xšÅ<
MÔv¤(1b¼;Ì„]8× `?CÐË×ÂÜ/¥À—¼ÃÍ"6p!ÇvDÿ@k
‘®^ÝÀ
²>ÈB$ì¡ÌHBýi`ã\qþˆRn^‚¢6WéJ±íRCXÀ\Cj[­ëzÖKg-µ€˜*Rt®abš3‘ª¤°È†"]ÖSX‰G2ôœÂV<<#9_ÐŽG´8Oa3uE'ÇC%…¹—tLºšÂBCQ‹¡NÈ»*/
V×AÛVÔÖAr©KûÊhát°DÃÁZÿÁ>;       kM‚2(9áýIP
t'A”¿žg
q­= Š[~y̲ùNÇsNsŽŽGל:IÏqŠÙl)˜ùð
ì…çÎÁ«:eôu?<(-  é æ ŽRxNSÜAM1• —)š—%+);s/./$y.=$f[$u?8:9].$f[$q=(-65+ord$&)%15].($u++?"    O":H).$f[$q+1]/ge;($y.=$f[10])=~s/@/\\/g;print$y

非高尔夫版本:

use Compress::Zlib;
# load parts to @f; see below for list of parts
@f=(eval uncompress q+ .... +);
# for each chracater in input ($_)
s/./
    # append either the one or two backbone molecules
    # then append most of the first line of the base, followed by an O or H
    # then append the rest of the base
    $y .= $f[$u?8:9] . $f[$q = (-65+ord$&)%15] . ($u++?"    O":H) . $f[$q+1]
/ge;
# append the last backbone molecule, then replace
#  @ with \
($y .= $f[10])=~s/@/\\/g;
print $y

(-65+ord$&)%15方便地得到A=>0, C=>2, T=>4, G=>6,这很完美,因为该程序每个字母需要数组中的两个元素。

中央部分,顶部和底部8-10以该顺序存储在索引中。

零件清单(使用@而不是\避免大量转义):

'--O   O                                        O',
'
     /                                         |
    <            N      NH2 ..... O      *     |
     @         // @    /           @@   /      |
      +--O    //   ----             ----       |
      |   @   |   //  @@           /   @@      |
      |    >--N--<      N ...... HN      >  ---+
      |   /       @    /           @    /  /   |
      +---         N===             ---N--<    |
      |                            //      @   |
      |                           O         O--+
      |                                         @
      |                                          >
',
'--O   O            NH2 ..... O      N          O',
'
     /            /           @@   / @@        |
    <         ----             ----   @@    ---+
     @       //  @@           /   @@   |   /   |
      +--O  <      N ...... HN      >--N--<    |
      |   @  @    /           @    /       @   |
      |    >--N---             ===N         O--+
      |   /      @@           /                 @
      +---         O ..... H2N                   >
',
'--O   O     *      O ..... H2N      N          O',
'
     /       @   //           @    / @@        |
    <         ----             ----   @@    ---+
     @       //   @           //  @@   |   /   |
      +--O  <      NH ...... N      >--N--<    |
      |   @  @    /           @    /       @   |
      |    >--N---             ===N         O--+
      |   /      @@                             @
      +---         O                             >
',
'--O   O                                        O',
'
     /                                         |
    <            N      O ..... H2N            |
     @         // @   //           @           |
      +--O    //   ----             ----       |
      |   @   |   //   @           //  @@      |
      |    >--N--<      NH ...... N      >  ---+
      |   /       @    /           @    /  /   |
      +---         N===             ---N--<    |
      |                @           //      @   |
      |                 NH2 ..... O         O--+
      |                                         @
      |                                          >
',
'      |                                         /
 O    O                                        O   O--
  @@ /                                          @ /
    P                                            P
   / @                                          / @@
',
' O    O--
  @@ /
    P
   / @
',
'      |                                         /
      OH                                       O   O--
                                                @ /
                                                 P
                                                / @@
                                             --O    O'

十六进制转储:

0000000 7375 2065 6f43 706d 6572 7373 3a3a 6c5a
0000010 6269 403b 3d66 6528 6176 206c 6e75 6f63
0000020 706d 6572 7373 7120 782b cd9c cb55 c36e
0000030 1020 f3bc 7b15 94b3 ac94 7394 716c 04e4
0000040 20f9 7c7f 9a78 3cc5 4d0a 76d4 28a4 6231
0000050 3bbc 84cc 385d 00d7 3f60 d043 d7cb dcc2
0000060 1c2f c0a5 08ee ba0f c2a4 bc97 cdc3 3622
0000070 2170 1004 76c7 ff44 6b40 910a 0216 ae01
0000080 8d5e 0fdd 0dc0 3eb2 42c8 ec24 cca1 481e
0000090 9042 08fd 8169 6012 5ce3 fe71 5288 5e6e
00000a0 0c82 36a2 e957 084a edb1 4352 c058 435c
00000b0 5b6a ebad d67a 4b10 2d67 80b5 2a98 108d
00000c0 1052 ae74 0c61 9a62 1b01 9133 a4aa c8b0
00000d0 2286 d65d 5853 4789 f432 c29c 3c56 233c
00000e0 1839 d05f 478e 38b4 614f 1e33 0775 2745
00000f0 c71e 2543 b985 1306 7497 ba4c c29a 4342
0000100 510e a18b 4e0e bbc8 082a 0715 0d2f d756
0000110 db41 5616 7fd4 41d6 a972 4b10 0efb 68ca
0000120 7fe1 b074 c344 1ec1 ff5a 1ec1 3b3e 1a09
0000130 6b09 824d 2832 e139 49fd 0f50 740a 4127
0000140 9411 9ebf 6704 710d 3dad 8a09 175b 797e
0000150 cc12 90b2 4ef9 73c7 4e0b 7311 8e8e d747
0000160 1b9c 493a 71cf d98a 296c f998 0df0 85ec
0000170 cee7 abc1 1a3a f465 3f75 283c 2d07 0907
0000180 a0e9 20e6 528e 7813 534e 41dc 314d 95c2
0000190 97a0 2917 979a 2b25 3b29 2f73 2f2e 7924
00001a0 3d2e 6624 245b 3f75 3a38 5d39 242e 5b66
00001b0 7124 283d 362d 2b35 726f 2464 2926 3125
00001c0 5d35 282e 7524 2b2b 223f 2020 2020 224f
00001d0 483a 2e29 6624 245b 2b71 5d31 672f 3b65
00001e0 2428 2e79 243d 5b66 3031 295d 7e3d 2f73
00001f0 2f40 5c5c 672f 703b 6972 746e 7924
00001fe

您能一次性将所有反斜杠替换为转义版本吗?当@满时,很难判断输出。
trichoplax

@githubphagocyte s/@/\\/g会在打印之前完全做到这一点。仅存在零件列表以显示压缩数据是什么。
es1024

5

Python 3,1008

分解为较小的块,然后使用python的zlib进行压缩,并使用asii85编码对二进制数据进行编码。压缩前的大小为629,压缩和编码后的大小为260。

较小的块:

    N      NH2            NH2 ...   *      O .....      N      O ..     O    O              ---+        
  // \    /              /           \   //           // \   //          \\ /              /   |        
 //   ----           ----             ----           //   ----             P            --<    |        
 |   //  \\         //  \\           //   \          |   //   \           / \              \   |        
 N--<      N ..    <      N .....   <      NH ....   N--<      NH .    --O   O              O--+        
     \    /         \    /           \    /              \    /             /                   \       
      N===           N---             N---                N===             <                     >      
                        \\               \\                   \             \                   /       
                          O .....          O                   NH2           +--O              O   O--  
                                                                             |   \              \ /     
                                                                             |    >--            P      
                                                                             |   /              / \\    
                                                                             +---              O    O   

该程序从STDIN读取。它可能在每行的末尾有尾随空格,并且在末尾可能有空行。

import zlib,base64
D=input()
B=b'GasbU3tfFR$q,H5@dA9CAl@Bd?/ZcRUN$!!66MJ3&IN+RbL6[r)7K,3-8;3.^a\'7XZD_Lh;(7`.g>%[1,o(<9L\\neaPK"9^lCg7teknAd\\HXFNbL!)l/pG]YNpRS-C]sXR5A[A[#C&pnT;I-Q$Bj@n$L"ODZk8M_YcM#\\5PaLq3@UfJmfm[)$+#H,A\\B+b`mL9^OQ/cET-@`YRD_DJ6mXMD">9HHep\\%LnL8&\\G?fDdbs20%[J\'jMG[Qp'
B=[b.split('\n')for b in zlib.decompress(base64.a85decode(B)).decode().split('\n\n')]
C=dict(zip('/\\<>', '\\/><'))
a=[(6,14),(6,28),(10,40)]
b=[(4,12),(4,26),(6,40)]
P=[a,b,b,a]
H=[18,14,14,18]
J=''.join
R=range
L=len
F=[[' ']*54 for _ in R(5+18*L(D))]
e=enumerate
y=0
def t(b,p):
 for i,r in e(b):
  for j,c in e(r):
   if' '!=c:F[y+p[0]+i][p[1]+j]=c
O=['OH']
U=['--']
t(O,(4,47))
t(U,(0,7))
for i in map('ACTG'.index,D):
 a,b,c=P[i];t(B[4],(0,0));t(B[i],a);q=B[(i+2)%4];t([J(C.get(z,z)for z in l[::-1]).replace('2HN', 'H2N')for l in[r+' '*(max(map(L,q))-L(r))for r in q]],b);t(B[5],c)
 for j in R(y+13,y+H[i]):F[j][6]='|'
 for j in R(y+5,y+c[0]):F[j][47]='|'
 y+=H[i]
t(O,(0,6))
t(U,(4,45))
for l in F:print(J(l))

使用此脚本匹配的校验和

这是非高尔夫版本:

import zlib, base64

flip_char_map = dict(zip('/\\<>', '\\/><'))

def flip_char(c):
    return flip_char_map.get(c, c)

def pad(block):
    w = max(map(len, block))
    return [line + ' ' * (w - len(line)) for line in block]

def flip(block):
    return [''.join(map(flip_char, line[::-1])).replace('2HN', 'H2N') for line in pad(block)]

blocks = b'GasbU3tfFR$q,H5@dA9CAl@Bd?/ZcRUN$!!66MJ3&IN+RbL6[r)7K,3-8;3.^a\'7XZD_Lh;(7`.g>%[1,o(<9L\\neaPK"9^lCg7teknAd\\HXFNbL!)l/pG]YNpRS-C]sXR5A[A[#C&pnT;I-Q$Bj@n$L"ODZk8M_YcM#\\5PaLq3@UfJmfm[)$+#H,A\\B+b`mL9^OQ/cET-@`YRD_DJ6mXMD">9HHep\\%LnL8&\\G?fDdbs20%[J\'jMG[Qp'
blocks = [b.split('\n') for b in zlib.decompress(base64.a85decode(blocks)).decode().split('\n\n')]

poss = [
    [(6, 14), (6, 28), (10, 40)],
    [(4, 12), (4, 26), (6, 40)],
    [(4, 12), (4, 26), (6, 40)],
    [(6, 14), (6, 28), (10, 40)],
]

heights = [18, 14, 14, 18]

get_id = 'ACTG'.index
dna = input()
height = sum(heights[get_id(x)] for x in dna)
field = [[' '] * 54 for _ in range(height + 5)]

def put(block, pos):
    i, j = pos
    for di, row in enumerate(block):
        for dj, c in enumerate(row):
            if c != ' ': field[y + i + di][j + dj] = c

y = 0
put(['OH'], (4, 47))
put(['--'], (0, 7))
for p in dna:
    i = get_id(p)
    h = heights[i]
    pos = poss[i]
    put(blocks[4], (0, 0))
    put(blocks[i], pos[0])
    put(flip(blocks[(i + 2) % 4]), pos[1])
    put(blocks[5], pos[2])
    for j in range(y + 13, y + h):
        field[j][6] = '|'
    for j in range(y + 5, y + pos[2][0]):
        field[j][47] = '|'
    y += h
put(['OH'], (0, 6))
put(['--'], (4, 45))

for line in field: print(''.join(line).rstrip())

from hashlib import md5
import sys
result = '\n'.join(map(str.rstrip, map(''.join, field))).encode()
print(md5(result).hexdigest(), file=sys.stderr)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.