Phân tích RNA thành codon


18

Giới thiệu

RNA là anh em họ ít nổi tiếng của DNA. Mục đích chính của nó là kiểm soát việc sản xuất protein trong các tế bào thông qua một quá trình gọi là dịch mã . Trong thử thách này, nhiệm vụ của bạn là thực hiện một phần của quá trình này, nơi RNA được tách thành các codon .

Thách thức này liên quan theo chủ đề, nhưng tập trung vào một phần khác của quá trình dịch thuật.

Codons

Chúng ta sẽ nghĩ về RNA như một chuỗi dài trên bảng chữ cái của các cặp cơ sở , AUCG. Trong dịch thuật, RNA được chia thành các phần không chồng chéo của ba cặp cơ sở, được gọi là codon. Quá trình này bắt đầu từ một start codon , AUG, và kết thúc tại một codon stop , một trong những UAA, UAGhoặc UGA. Mỗi codon (trừ codon dừng) tương ứng với một axit amin và chuỗi axit amin tạo thành protein.

Đầu vào

Đầu vào của bạn là một chuỗi RNA không trống.

Đầu ra

Đầu ra của bạn là danh sách các codon trong đó RNA được phân tách, ở bất kỳ định dạng hợp lý nào. Trong mô hình đơn giản hóa này, quá trình bắt đầu ở codon bắt đầu ngoài cùng bên tráiAUG , được bao gồm trong đầu ra. Nó kết thúc khi gặp một codon dừng hoặc khi chúng ta hết RNA. Nếu đầu vào không chứa codon bắt đầu, đầu ra sẽ là một danh sách trống.

Ví dụ

Xem xét chuỗi đầu vào

ACAUGGAUGGACUGUAACCCCAUGC

Việc phân tích cú pháp bắt đầu ở lần xuất hiện ngoài cùng bên trái của AUG, tại chỉ mục 2. Nó tiếp tục như sau:

AC AUG GAU GGA CUG UAA CCCCAUGC
   *   ^   ^   ^   +

Các codon được đánh dấu *là codon bắt đầu và những codon được đánh dấu ^cũng là một phần của đầu ra. Các codon dừng được đánh dấu bằng +. Đầu ra đúng là

AUG,GAU,GGA,CUG

Đối với đầu vào ngắn hơn

ACAUGGAUGGACUGU

quá trình đi

AC AUG GAU GGA CUG U
   *   ^   ^   ^

Lần này, một codon dừng không gặp phải, vì vậy quá trình dừng lại khi chúng ta hết cặp cơ sở. Đầu ra giống như trên.

Quy tắc và tính điểm

Bạn có thể viết một chương trình đầy đủ của một chức năng. Số byte thấp nhất sẽ thắng và các sơ hở tiêu chuẩn không được phép.

Các trường hợp thử nghiệm

GGUACGGAUU -> 
GGCGAAAUCGAUGCC -> AUG
ACAUGGAUGGACUGU -> AUG,GAU,GGA,CUG
AUGACGUGAUGCUUGA -> AUG,ACG
UGGUUAGAAUAAUGAGCUAG -> AUG,AGC
ACAUGGAUGGACUGUAACCCCAUGC -> AUG,GAU,GGA,CUG
CUAAGAUGGCAUGAGUAAUGAAUGGAG -> AUG,GCA
AAUGGUUUAAUAAAUGUGAUAUGAUGAUA -> AUG,GUU
UGUCACCAUGUAAGGCAUGCCCAAAAUCAG -> AUG
UAUAGAUGGUGAUGAUGCCAUGAGAUGCAUGUUAAU -> AUG,GUG,AUG,AUG,CCA
AUGCUUAUGAAUGGCAUGUACUAAUAGACUCACUUAAGCGGUGAUGAA -> AUG,CUU,AUG,AAU,GGC,AUG,UAC
UGAUAGAUGUAUGGAUGGGAUGCUCAUAGCUAUAAAUGUUAAAGUUAGUCUAAUGAUGAGUAGCCGAUGGCCUAUGAUGCUGAC -> AUG,UAU,GGA,UGG,GAU,GCU,CAU,AGC,UAU,AAA,UGU

13
Mối quan hệ của DNA với RNA với protein đã từng được giải thích với tôi bằng thuật ngữ điện toán mà tôi có thể hiểu: DNA tương đương với một chương trình trên đĩa cứng; RNA tương đương với chương trình đó được nạp vào bộ nhớ; và protein tương đương với dữ liệu đầu ra được tạo ra do kết quả của chương trình đó đang chạy.
Chấn thương kỹ thuật số

4
Giáo điều của sinh học phân tử là "DNA tạo ra RNA tạo ra protein". Vì vậy, DNA khá hiếm và RNA ít nổi tiếng hơn, nhưng phổ biến hơn nhiều. Protein là phổ biến nhất của tất cả.
Cấp sông St

1
@DigitalTrauma: Là một nhà di truyền học, tôi cần chỉ ra rằng sự tương tự này là không đủ để mô tả thực tế về cách thức hoạt động của DNA. DNA không phải là thứ chết chóc đang chờ được phiên mã thành RNA để nó có thể làm gì đó.
Jack Aidley

Điều gì thực sự xảy ra trong thực tế nếu một đoạn mRNA chấm dứt trước một codon dừng (như trong ví dụ đơn giản), có nghĩa là không có bộ ba dừng để một yếu tố phát hành liên kết với?
Tái lập lại Monica - -

1
Nội dung đĩa cứng @Jack cũng không hẳn là thứ chết - nâng cấp, cập nhật tự động, v.v., mặc dù tất nhiên là không tự phục hồi đến mức tôi hiểu DNA. Nhưng bạn đã đúng - Đó là một sự tương tự yếu. Tuy nhiên, tôi nghĩ rằng nó đã giúp bản thân không phải là nhà di truyền học của tôi gần gũi hơn với sự hiểu biết của giáo dân
Chấn thương kỹ thuật số

Câu trả lời:


9

Võng mạc , 39 38 32 30 byte

M!`AUG|\B\G...
U(AA|AG|GA)\D*

Các linefeed trailing là đáng kể.

Đầu ra dưới dạng một danh sách được phân tách theo dòng.

Hãy thử trực tuyến.

Giải trình

M!`AUG|\B\G...

Đây là giai đoạn khớp để biến đầu vào thành một danh sách được phân tách theo dòng cho tất cả các kết quả khớp (do !). Bản thân regex phù hợp với mọi codon bắt đầu từ đầu tiên AUG. Chúng tôi đạt được điều này với hai lựa chọn riêng biệt. AUGphù hợp vô điều kiện, để nó có thể bắt đầu danh sách các trận đấu. Trận đấu thứ hai có thể là bất kỳ codon nào ( ...khớp với ba ký tự bất kỳ), nhưng \Glà một neo đặc biệt đảm bảo rằng điều này chỉ có thể khớp ngay sau một trận đấu khác. Vấn đề duy nhất là nó \Gcũng khớp ở đầu chuỗi mà chúng ta không muốn. Vì đầu vào chỉ bao gồm các ký tự từ, chúng tôi sử dụng \B(bất kỳ vị trí nào không phải là ranh giới từ) để đảm bảo rằng kết quả khớp này không được sử dụng ở đầu đầu vào.

U(AA|AG|GA)\D*

Điều này tìm thấy codon dừng đầu tiên, phù hợp U(AA|AG|GA)cũng như mọi thứ sau nó và loại bỏ nó khỏi chuỗi. Vì giai đoạn đầu tiên phân tách các codon thành các dòng riêng biệt, chúng tôi biết rằng trận đấu này được căn chỉnh chính xác với codon bắt đầu. Chúng tôi sử dụng \D(không phải chữ số) để khớp với bất kỳ ký tự nào, vì .sẽ không đi qua các nguồn cấp dữ liệu và đầu vào sẽ không chứa các chữ số.


5

Haskell, 115 112 byte

import Data.Lists
fst.break(\e->elem e["UAA","UAG","UGA"]||length e<3).chunksOf 3.snd.spanList((/="AUG").take 3)

Ví dụ sử dụng:

*Main> ( fst.break(\e->elem e["UAA","UAG","UGA"]||length e<3).chunksOf 3.snd.spanList((/="AUG").take 3) ) "AUGCUUAUGAAUGGCAUGUACUAAUAGACUCACUUAAGCGGUGAUGAA"
["AUG","CUU","AUG","AAU","GGC","AUG","UAC"]

Làm thế nào nó hoạt động:

                spanList((/="AUG").take 3)  -- split input at the first "AUG"
             snd                            -- take 2nd part ("AUG" + rest)
     chunksOf 3                             -- split into 3 element lists
fst.break(\e->                              -- take elements from this list
           elem e["UAA","UAG","UGA"]||      -- as long as we don't see end codons
           length e<3)                      -- or run out of full codons 

1

JavaScript 88 82 70 69 ký tự

s=>/AUG(...)+?(?=(U(AA|AG|GA)|$))/.exec(s)[0].match(/.../g).join(",")

Ví dụ sử dụng:

(s=>/AUG(...)+?(?=(U(AA|AG|GA)|$))/.exec(s)[0].match(/.../g).join(","))("ACAUGGAUGGACUGUAACCCCAUGC")

Điều này không thất bại cho đầu vào mà không có codon dừng?
Flambino

1
Bạn nói đúng, tôi không thấy đó là một lựa chọn, sửa chữa
Benjamin Gruenbaum

Hãy thử s=>/AUG(...)+?(?=(U(AA|AG|GA)|$))/.exec(s)[0].match(/.../g).
Mama Fun Roll

Vẫn thất bại cho các codon dừng. (Thử trường hợp thử 3)
user81655

1

Python 2, 185 byte

i=input()
o=[]
if i.find('AUG')>=0:i=map(''.join,zip(*[iter(i[i.find('AUG'):])]*3))
else:print "";exit()
for j in i:
 if j not in['UGA','UAA','UAG']:o+=[j]
 else:break
print ','.join(o)

Giải thích Đặt ithành đầu vào. Tách nó từ 'AUG' đến cuối. Chia thành ba chuỗi. Kiểm tra nếu dừng codon, và cắt.

Hãy thử nó ở đây


1

MATL , 57 byte

j'AUG(...)*?(?=(UAA|UAG|UGA|.?.?$))'XXtn?1X)tnt3\-:)3[]e!

Cái này dùng phiên bản hiện tại (9.3.1) của ngôn ngữ / trình biên dịch.

Đầu vào và đầu ra là thông qua stdin và stdout. Đầu ra được phân tách bằng ngắt dòng.

Thí dụ

>> matl
 > j'AUG(...)*?(?=(UAA|UAG|UGA|.?.?$))'XXtn?1X)tnt3\-:)3[]e!
 >
> ACAUGGAUGGACUGUAACCCCAUGC
AUG
GAU
GGA
CUG

EDIT (ngày 12 tháng 6 năm 2016): để thích ứng với những thay đổi trong ngôn ngữ, []cần được loại bỏ. Liên kết dưới đây bao gồm sửa đổi đó

Hãy thử trực tuyến!

Giải trình

Mã được dựa trên biểu thức chính quy

AUG(...)*?(?=(UAA|UAG|UGA|.?.?$))

Trận này chuỗi con bắt đầu với AUG, có chứa nhóm của ba nhân vật ( ...) và kết thúc bằng một trong hai UAA, UAGhoặc UGA; hoặc kết thúc ở cuối chuỗi và trong trường hợp này có thể có một nhóm không hoàn chỉnh cuối cùng ( .?.?$). Lookahead ( (?=...)) được sử dụng để các codon dừng không phải là một phần của trận đấu. Sự phù hợp là lazy ( *?) để kết thúc tại codon dừng đầu tiên được tìm thấy, nếu có.

j                                     % input string
'AUG(...)*?(?=(UAA|UAG|UGA|.?.?$))'   % regex
XX                                    % apply it. Push cell array of matched substrings
tn?                                   % if non-empty
1X)                                   % get first substring
tnt3\-:)                              % make length the largest possible multiple of 3
3[]e!                                 % reshape into rows of 3 columns
                                      % implicit endif
                                      % implicit display

0

Ruby, 97 95 78 75 62 byte

->(r){r.scan(/AUG|\B\G.../).join(?,).sub(/,U(AA|AG|GA).*/,'')}

Tôi không chơi gôn nhiều, vì vậy tôi chắc chắn rằng nó có thể được cải thiện.

Chỉnh sửa: Stole Mượn \B\Gmánh khóe tuyệt vời của Martin Büttner

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.