RNS in Codons analysieren

18

Einführung

RNA ist der weniger berühmte Cousin der DNA. Sein Hauptzweck besteht darin, die Produktion von Proteinen in Zellen durch einen Prozess zu steuern, der als Translation bezeichnet wird . In dieser Herausforderung besteht Ihre Aufgabe darin, einen Teil dieses Prozesses zu implementieren, bei dem die RNA in Codons aufgeteilt wird .

Diese Herausforderung ist thematisch verwandt, konzentriert sich jedoch auf einen anderen Teil des Übersetzungsprozesses.

Codons

Wir werden uns RNA als eine lange Kette über dem Alphabet der Basenpaare vorstellen AUCG. Bei der Translation wird RNA in nicht überlappende Stücke von drei Basenpaaren, sogenannte Codons, aufgeteilt. Der Prozess beginnt bei einem Start - Codon , AUGund endet an einem Stopp - Codon , einen UAA, UAGoder UGA. Jedes Codon (mit Ausnahme der Stoppcodons) entspricht einer Aminosäure, und die resultierende Aminosäuresequenz bildet das Protein.

Eingang

Ihre Eingabe ist ein nicht leerer RNA-String.

Ausgabe

Ihre Ausgabe ist die Liste der Codons, in die die RNA in einem angemessenen Format aufgeteilt ist. In diesem vereinfachten Modell beginnt der Prozess mit dem Startcodon ganz linksAUG , das in der Ausgabe enthalten ist. Es endet, wenn ein Stopcodon auftritt oder wenn die RNA ausgeht. Wenn die Eingabe kein Startcodon enthält, muss die Ausgabe eine leere Liste sein.

Beispiele

Beachten Sie die Eingabereihenfolge

ACAUGGAUGGACUGUAACCCCAUGC

Das Parsen beginnt ganz links AUGbei Index 2. Es wird wie folgt fortgesetzt:

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

Das mit gekennzeichnete Codon *ist das Startcodon, und die mit gekennzeichneten Codons ^sind ebenfalls Teil der Ausgabe. Das Stoppcodon ist mit gekennzeichnet +. Die korrekte Ausgabe ist

AUG,GAU,GGA,CUG

Für die kürzere Eingabe

ACAUGGAUGGACUGU

Der Prozess geht

AC AUG GAU GGA CUG U
   *   ^   ^   ^

Dieses Mal ist kein Stoppcodon aufgetreten, sodass der Prozess stoppt, wenn die Basenpaare ausgehen. Die Ausgabe ist die gleiche wie oben.

Regeln und Wertung

Sie können ein vollständiges Programm einer Funktion schreiben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig.

Testfälle

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
Zgarb
quelle
13
Das Verhältnis von DNA zu RNA zu Protein wurde mir einmal in Begriffen erklärt, die ich verstehen konnte: DNA entspricht einem Programm auf einer Festplatte; RNA entspricht dem in den Speicher geladenen Programm; und Protein entspricht den Ausgabedaten, die als Ergebnis dieser Programmausführung erzeugt wurden.
Digitales Trauma
4
Das Dogma der Molekularbiologie lautet: "DNA macht RNA macht Protein." DNA ist also ziemlich selten, und RNA ist weniger berühmt, aber weitaus häufiger. Protein ist am häufigsten von allen.
Level River St
1
@DigitalTrauma: Als Genetiker muss ich darauf hinweisen, dass diese Analogie absolut unzureichend ist, um die Realität der DNA-Funktionsweise zu beschreiben. DNA ist keine tote Sache, die darauf wartet, in RNA transkribiert zu werden, damit sie etwas bewirken kann.
Jack Aidley
Was passiert eigentlich in der Praxis, wenn ein Stück mRNA vor einem Stoppcodon terminiert (wie im einfachen Beispiel), was bedeutet, dass kein Stopptriplett für einen Freisetzungsfaktor zur Bindung vorhanden ist?
Setzen Sie Monica wieder ein - ----
1
@Jack-Festplatteninhalte sind auch nicht unbedingt tote Dinge - Upgrades, automatische Updates usw., obwohl sie sich natürlich nicht in dem Maße selbst heilen, wie ich DNA verstehe. Aber du hast recht - es ist eine schwache Analogie. Ich denke jedoch, dass es mein nicht-genetisches Selbst einem Laienverständnis ein wenig näher gebracht hat
Digitales Trauma

Antworten:

9

Retina , 39 38 32 30 Bytes

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

Der Zeilenvorschub am Ende ist signifikant.

Ausgabe als durch Zeilenvorschub getrennte Liste.

Probieren Sie es online aus.

Erläuterung

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

Dies ist die Übereinstimmungsstufe, die die Eingabe in eine durch Zeilenvorschub getrennte Liste aller Übereinstimmungen (aufgrund der !) umwandelt . Die Regex selbst passt zu jedem Codon ab dem ersten AUG. Dies erreichen wir mit zwei getrennten Optionen. AUGÜbereinstimmungen bedingungslos, damit die Liste der Übereinstimmungen gestartet werden kann. Die zweite Übereinstimmung kann ein beliebiges Codon sein ( ...entspricht drei beliebigen Zeichen), es handelt sich jedoch \Gum einen speziellen Anker, der sicherstellt, dass dies nur direkt nach einer anderen Übereinstimmung möglich ist. Das einzige Problem ist, dass \Gauch am Anfang der Zeichenfolge übereinstimmt, was wir nicht wollen. Da die Eingabe nur aus Wortzeichen besteht, verwenden wir \B(jede Position, die keine Wortgrenze ist), um sicherzustellen, dass diese Übereinstimmung nicht am Anfang der Eingabe verwendet wird.

U(AA|AG|GA)\D*

Dies findet das erste Stoppcodon, das U(AA|AG|GA)ebenso wie alles danach übereinstimmt , und entfernt es aus der Zeichenfolge. Da die erste Stufe die Codons in separate Zeilen aufteilt, wissen wir, dass diese Übereinstimmung richtig mit dem Startcodon ausgerichtet ist. Wir verwenden \D(Nicht-Ziffern), um Zeichen .zuzuordnen, da die Zeilenvorschübe nicht überschritten werden und die Eingabe keine Ziffern enthält.

Martin Ender
quelle
5

Haskell, 115 112 Bytes

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

Anwendungsbeispiel:

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

Wie es funktioniert:

                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 
nimi
quelle
1

JavaScript 88 82 70 69 Zeichen

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

Anwendungsbeispiel:

(s=>/AUG(...)+?(?=(U(AA|AG|GA)|$))/.exec(s)[0].match(/.../g).join(","))("ACAUGGAUGGACUGUAACCCCAUGC")
Benjamin Gruenbaum
quelle
Schlägt dies bei Eingaben ohne Stoppcodon nicht fehl?
Flambino
1
Du hast recht, ich habe nicht gesehen, dass das eine Option ist, um das
Problem zu
Versuchen Sie es s=>/AUG(...)+?(?=(U(AA|AG|GA)|$))/.exec(s)[0].match(/.../g).
Mama Fun Roll
Schlägt immer noch für Stop-Codons fehl. (Probieren Sie Testfall 3 aus)
user81655
1

Python 2, 185 Bytes

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)

Erklärung Auf iEingabe setzen. Teilen Sie es von 'AUG' bis zum Ende auf. In drei Teile teilen. Überprüfen Sie, ob Stop Codon und schneiden.

Probieren Sie es hier aus

TanMath
quelle
1

MATL , 57 Bytes

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

Dies verwendet die aktuelle Version (9.3.1) der Sprache / des Compilers.

Ein- und Ausgabe erfolgen über stdin und stdout. Die Ausgabe wird durch Zeilenumbrüche getrennt.

Beispiel

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

BEARBEITEN (12. Juni 2016): Um sich an Änderungen in der Sprache anzupassen, []sollte entfernt werden. Der unten stehende Link enthält diese Änderung

Probieren Sie es online!

Erläuterung

Der Code basiert auf dem regulären Ausdruck

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

Das paßt Strings mit dem Starten AUG, mit Gruppen von drei Zeichen ( ...) und in entweder endet UAA, UAGoder UGA; oder am Ende der Zeichenkette enden, und in diesem Fall kann es eine letzte unvollständige Gruppe geben ( .?.?$). Lookahead ( (?=...)) wird verwendet, damit die Stoppcodons nicht Teil der Übereinstimmung sind. Der Abgleich ist faul ( *?), um beim ersten gefundenen Stoppcodon zu enden, falls vorhanden.

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
Luis Mendo
quelle
0

Ruby, 97 95 78 75 62 Bytes

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

Ich spiele nicht viel Golf, also bin ich sicher, dass es verbessert werden kann.

Edit: Stola Martin Büttners exzellenten \B\GTrick ausgeliehen

Flambino
quelle