DNA: Deoxyribonucleic ASCII


22

Đưa ra một chuỗi các cơ sở Adenine, Cytosine, Guanine và Thymine (được mã hóa dưới dạng ACGT), bạn sẽ tạo ra một đại diện nghệ thuật ASCII của một chuỗi DNA tương ứng.

Các sợi sẽ mở rộng theo chiều dọc. Chuỗi bên trái là chuỗi bạn được cung cấp làm đầu vào. Các sợi bên tay phải sẽ là bổ sung của nó. Đối với những người không quen thuộc với DNA, Ađược ghép nối TCđược ghép nối với G. Hơn nữa, có cấu trúc xương sống ở hai bên của chuỗi kép giống hệt nhau cho tất cả các cơ sở. Vì vậy, nếu bạn được cung cấp đầu vào TAGCAT, cấu trúc quy mô lớn của nghệ thuật ASCII sẽ là:

BTAB
BATB
BGCB
BCGB
BATB
BTAB

nơi Bđại diện cho xương sống. Bây giờ mỗi chữ cái này là viết tắt của toàn bộ một phân tử và bạn sẽ tái tạo cấu trúc phân tử thực tế .

Căn cứ

Sử dụng các mẫu 1 sau đây cho mỗi cơ sở (mỗi mẫu được hiển thị cùng với cơ sở bổ sung và hai phân tử xương sống):

1 Tín dụng cho Peter Taylor vì đã giúp đỡ với bố cục ASCII.

Adenine

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

Cytosin

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

Quan

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

Tuyến ức

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

Xây dựng sợi đôi

Chúng lặp lại theo chiều dọc, sao cho không có khoảng trống trong cấu trúc xương sống. Điều này có nghĩa là các hộp giới hạn của bốn mẫu này sẽ chồng lên nhau.

Đầu dưới cùng bên trái và đầu trên của xương sống bên phải sẽ kết nối với đầu Ocủa một OH.

Sự tự do Oở đầu trên cùng của đầu bên trái và dưới cùng của xương sống bên phải sẽ có một trái phiếu tự do đi vào bên trong, được chỉ định bởi --.

Thí dụ 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

Thêm ví dụ:

Dưới đây là các giá trị băm MD5 của một số ví dụ khác (không có dấu cách hàng đầu hoặc dấu cách bên ngoài):

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

Hãy cho tôi biết nếu bạn nghĩ bất kỳ điều nào trong số này là sai.

Nếu bạn không chắc chắn cách kiểm tra băm kết quả của mình một cách đáng tin cậy, hãy thử trình tạo MD5 trực tuyến này . Hãy chắc chắn rằng không có dấu ngắt dòng.

Ghi chú thêm

Bạn có thể sử dụng không gian hàng đầu hoặc dấu vết khi bạn thấy phù hợp. Tất nhiên, nếu bạn sử dụng các khoảng trắng hàng đầu thì nó phải có cùng số tiền trong mỗi dòng.

Nếu tôi có bất kỳ sai lầm nào trong việc sao chép cấu trúc hóa học, các mẫu trên vẫn mang tính quy phạm cho mục đích của thử thách này.

Bạn có thể viết một hàm hoặc một chương trình lấy chuỗi đầu vào làm tham số, đối số dòng lệnh thông qua STDIN hoặc hy vọng nó sẽ được lưu trữ trong một biến. Viết nghệ thuật ASCII kết quả vào STDOUT.

Đây là mã golf, vì vậy câu trả lời ngắn nhất (tính bằng byte) sẽ thắng.


Thử thách tuyệt vời!
Ray

9
Cần phải có GATTACA
Kevin

1
@Kevin Tôi thậm chí đã nghĩ về điều đó trước đây, vì vậy tôi đã thêm nó ngay bây giờ. ;) Tôi cũng đã sửa lỗi băm TTTvì chuỗi chứa một dòng mới.
Martin Ender

Làm thế nào để bạn có được tổng kiểm tra md5? Tôi đã sao chép ATGđầu ra của bạn và có tổng kiểm tra khác nhau. Và hệ điều hành khác nhau sẽ nhận được tổng kiểm khác nhau. Bạn có thể thử những thứ này với unix2dos, unix2mac....
Ray

@Ray Tôi đã nhận được chúng bằng cách sử dụng Ruby Digest::MD5.hexdigest()với các kết thúc dòng kiểu Unix. Ngoài ra, không ai trong số họ có một dòng mới. Dán nó ở đây - trình tạo MD5 trực tuyến này đồng ý với các giá trị băm của tôi.
Martin Ender

Câu trả lời:


2

Perl 5 (510)

Perl rất ổn với byte rỗng, vì vậy vui lòng sử dụng hexdump được cung cấp để chạy này.

Điều này hoạt động bằng cách in ra các phần khác nhau của chuỗi DNA, với các phần là một hoặc nhiều dòng. Một O hoặc H được thêm vào dòng trên cùng của mỗi thành phần để đảm bảo đầu ra hợp lệ.

Giả sử đầu vào là trong biến $_.

Phiên bản chơi gôn:

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

Phiên bản bị đánh cắp:

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$&)%15kết quả thuận tiện A=>0, C=>2, T=>4, G=>6, đó là hoàn hảo vì chương trình cần hai yếu tố trong mảng cho mỗi chữ cái.

Phần trung tâm, phần trên cùng và phần dưới cùng được lưu trữ trong các chỉ 8-10mục theo thứ tự đó.

Danh sách các bộ phận (sử dụng @ thay vì \ để tránh hàng tấn thoát):

'--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'

Hexdump:

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

Bạn có thể thay thế tất cả các dấu gạch chéo ngược bằng phiên bản thoát trong một lần không? Thật khó để đánh giá đầu ra khi nó đầy @.
trichoplax

@githubphagocyte s/@/\\/gthực hiện chính xác điều đó, trước khi in. Danh sách các bộ phận chỉ hiện diện để hiển thị dữ liệu nén là gì.
es1024

5

Trăn 3, 1008

Phân tách thành các khối nhỏ hơn và sau đó nén bằng zlib của python và mã hóa dữ liệu nhị phân bằng mã hóa asii85. Trước khi nén, kích thước là 629 và sau khi nén và mã hóa, kích thước là 260.

Khối nhỏ hơn:

    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   

Chương trình đọc từ STDIN. Nó có thể có các khoảng trống ở cuối mỗi dòng và có thể có các dòng trống ở cuối.

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))

Tổng kiểm tra khớp với tập lệnh này

Và đây là phiên bản chưa được chỉnh sửa:

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.