RNAをコドンに解析する


18

前書き

RNAはDNAのあまり知られていないいとこです。その主な目的は、翻訳と呼ばれるプロセスを通じて細胞内のタンパク質の生産を制御することです。この課題では、あなたの仕事は、RNAがコドンに分割されるこのプロセスの一部を実装することです。

この課題はテーマ的に関連していますが、翻訳プロセスの別の部分に集中しています。

コドン

RNAは、塩基対のアルファベット上の長い文字列であると考えますAUCG。翻訳では、RNAはコドンと呼ばれる3つの塩基対の重複しないチャンクに分割されます。プロセスはから始まり開始コドンAUGおよびで終わる終止コドンの一つUAAUAG又はUGA。各コドン(停止コドンを除く)はアミノ酸に対応し、結果として生じるアミノ酸のストリングがタンパク質を形成します。

入力

入力は空でない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はメモリにロードされたプログラムと同じです。タンパク質は、そのプログラムの実行の結果として生成された出力データに相当します。
デジタル外傷

4
分子生物学の教義は「DNAはRNAをタンパク質にします」です。したがって、DNAはかなりまれであり、RNAはそれほど有名ではありませんが、はるかに一般的です。タンパク質はすべての中で最も一般的です。
レベル川セント

1
@DigitalTrauma:遺伝学者として、このアナロジーはDNAがどのように機能するかの現実を記述するにはひどく不十分であることを指摘する必要があります。DNAはRNAに転写されるのを待っている死んだものではないので、何かをすることができます。
ジャックエイドリー

実際にmRNAの一部が停止コドンの前で終了すると(実際の例のように)、放出因子が結合する停止トリプレットがないことを実際に何が起こるでしょうか?
モニカの復職-ζ--16年

1
@Jackのハードディスクの内容は、必ずしも死んだものではありません-アップグレード、自動更新など、もちろん私が理解しているDNAの範囲では自己回復しません。しかし、あなたは正しい-それは弱いアナロジーです。しかし、私はそれが私の非遺伝学者の自己を素人の理解に少し近づいたと思います
デジタル外傷

回答:


9

網膜39 38 32 30バイト

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

後続の改行は重要です。

改行区切りリストとして出力します。

オンラインでお試しください。

説明

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

これは、入力をすべての一致の改行区切りリストに変換する一致ステージです(のため!)。正規表現自体は、最初のから始まるすべてのコドンに一致しAUGます。これを実現するには、2つのオプションがあります。AUG無条件に一致するため、一致のリストを開始できます。2番目の一致は、任意のコドン(...任意の3文字に一致)に\Gすることができますが、これは別の一致の直後にのみ一致できるようにする特別なアンカーです。唯一の問題は\G、文字列の先頭でも一致することです。これは望ましくありません。入力は単語文字のみで構成されるため、\B(単語の境界ではない任意の位置)を使用して、この一致が入力の先頭で使用されないようにします。

U(AA|AG|GA)\D*

これにより、最初の停止コドンが検索さU(AA|AG|GA)れ、一致するものだけでなく、その後のすべてのものが検索され、文字列から削除されます。最初の段階ではコドンが別々の行に分割されるため、この一致が開始コドンと適切に整列していることがわかります。改行を通過せず、入力に数字が含まれないため\D、任意の文字と一致させるために(数字以外)を使用し.ます。


5

ハスケル、115 112バイト

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

これは、停止コドンのない入力では失敗しませんか?
フランビーノ

1
あなたは正しい、私はそれがオプションであるとは思わなかった、修正
ベンジャミングリュンバウム

試してくださいs=>/AUG(...)+?(?=(U(AA|AG|GA)|$))/.exec(s)[0].match(/.../g)
ママファンロール

停止コドンではまだ失敗します。(テストケース3を試してください)
-user81655

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」から最後まで分割します。3つの文字列に分割します。停止コドンかどうかを確認し、カットします。

ここで試してみてください


1

MATL、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(3つの文字のグループを含む...)のいずれかで終わるUAAUAGまたはUGA; または、文字列の最後で終了します。この場合、最後の不完全なグループが1つある可能性があります(.?.?$)。先読み(?=...))を使用して、停止コドンが一致の一部にならないようにします。一致は、見つかった最初の停止コドンがある場合に終了するために遅延*?)です。

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

ルビー、97 95 78 75 62バイト

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

ゴルフはあまりしないので、改善できると確信しています。

編集:盗まれたマーティン・ブットナーの優れた\B\Gトリックを借りた

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.