将RNA解析为密码子


18

介绍

RNA是DNA的近亲。其主要目的是通过称为翻译的过程控制细胞中蛋白质的产生。在这一挑战中,您的任务是实施该过程的一部分,其中将RNA分成密码子

这项挑战与主题相关,但集中在翻译过程的另一部分。

密码子

我们将RNA视为碱基对字母上的长字符串AUCG。在翻译中,RNA被分为三个碱基对的非重叠片段,称为密码子。该过程开始于一个起始密码子AUG以及在端部一终止密码子的一个UAAUAGUGA。每个密码子(终止密码子除外)都对应一个氨基酸,并且所形成的氨基酸串形成蛋白质。

输入值

您输入的是非空的RNA字符串。

输出量

您的输出是将RNA分割成任何合理格式的密码子列表。在此简化模型中,过程从最左侧的起始密码子开始,该密码子AUG包含在输出中。当遇到终止密码子或我们用完RNA时,它结束。如果输入不包含起始密码子,则输出应为空列表。

例子

考虑输入顺序

ACAUGGAUGGACUGUAACCCCAUGC

解析从的最左边出现AUG在索引2 开始。它继续如下:

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

*有的密码子是起始密码子,标^有的密码子也是输出的一部分。终止密码子标有+。正确的输出是

AUG,GAU,GGA,CUG

对于较短的输入

ACAUGGAUGGACUGU

过程进行

AC AUG GAU GGA CUG U
   *   ^   ^   ^

这次,没有遇到终止密码子,所以当我们用完碱基对时,该过程停止。输出与上面相同。

规则和计分

您可以编写功能的完整程序。最低字节数获胜,并且不允许出现标准漏洞。

测试用例

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
DNA,RNA,蛋白质之间的关系曾经以我能理解的术语向我解释过:DNA等同于硬盘上的程序;RNA等于加载到内存中的程序;蛋白质等于该程序运行产生的输出数据。
Digital Trauma

4
分子生物学的教条是“ DNA产生RNA产生蛋白质”。因此,DNA相当稀少,RNA虽不那么著名,但更为普遍。蛋白质是最常见的。
级圣河

1
@DigitalTrauma:作为遗传学家,我需要指出,这种类比不足以描述DNA的工作原理。DNA不是等待被转录为RNA的死物,因此它可以做一些事情。
杰克·艾德利

实际上,如果一段mRNA在终止密码子之前终止(如在简单示例中),这意味着释放因子没有结合的终止三联体,实际上会发生什么?
恢复莫妮卡-ζ-16年

1
@Jack硬盘中的内容也不一定是死的东西-升级,自动更新等,尽管按照我的理解DNA当然不能自我修复。但是你是对的-这是一个很弱的类比。但是,我认为它使我的非遗传主义者的自我更加接近了外行的理解
Digital Trauma

Answers:


9

视网膜39 38 32 30字节

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

尾随换行很重要。

输出为以换行符分隔的列表。

在线尝试。

说明

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

这是比赛阶段,它将输入转换为所有比赛的换行分隔列表(由于!)。正则表达式本身会匹配从第一个开始的每个密码子AUG。我们通过两个单独的选项来实现。AUG无条件匹配,因此它可以开始匹配列表。第二个匹配项可以是任何密码子(...匹配任何三个字符),但是\G特殊的定位符,可确保仅在另一个匹配项之后才匹配。唯一的问题是,它\G也匹配字符串的开头,这是我们不想要的。由于输入仅包含单词字符,因此我们使用\B(不是单词边界的任何位置)来确保在输入的开头不使用此匹配项。

U(AA|AG|GA)\D*

这将找到匹配的第一个终止密码子U(AA|AG|GA)及其后的所有内容,并将其从字符串中删除。由于第一阶段将密码子分成不同的行,因此我们知道此匹配与起始密码子正确对齐。我们使用\D(非数字)来匹配任何字符,因为它.不会超出换行符,并且输入将不包含数字。


5

Haskell,115112字节

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

用法示例:

*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"]

怎么运行的:

                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个字符

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

用法示例:

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

如果没有终止密码,输入是否失败?
Flambino '16

1
您是对的,我没有看到这是一个解决办法,请解决
Benjamin Gruenbaum

尝试s=>/AUG(...)+?(?=(U(AA|AG|GA)|$))/.exec(s)[0].match(/.../g)
Mama Fun Roll

仍然无法获得终止密码子。(尝试测试用例3)
user81655 '16

1

Python 2,185字节

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)

说明 设置i为输入。将其从“ AUG”拆分到末尾。分成三串。检查是否终止密码子并切割。

在这里尝试


1

玛特,57字节

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

这使用 语言/编译器的当前版本(9.3.1)

输入和输出通过stdin和stdout进行。输出以换行符分隔。

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

编辑(2016年6月12日):以适应语言的变化, []应删除。下面的链接包括该修改

在线尝试!

说明

该代码基于正则表达式

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

此匹配的子串开始AUG,包含三个字符组(...),并在任一结束UAAUAGUGA; 或以字符串末尾结尾,在这种情况下,可能会有最后一个不完整的组(.?.?$)。使用前瞻(?=...)),以使终止密码子不属于匹配项。匹配是惰性*?),以便在找到的第一个终止密码子处完成(如有)。

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字节

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

我打高尔夫球的程度不高,所以我可以肯定它会得到改善。

编辑:偷了马丁·布特纳的\B\G绝招

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.