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 , AUG
und endet an einem Stopp - Codon , einen UAA
, UAG
oder 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 AUG
bei 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
Antworten:
Retina ,
39383230 BytesDer Zeilenvorschub am Ende ist signifikant.
Ausgabe als durch Zeilenvorschub getrennte Liste.
Probieren Sie es online aus.
Erläuterung
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 erstenAUG
. 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\G
um einen speziellen Anker, der sicherstellt, dass dies nur direkt nach einer anderen Übereinstimmung möglich ist. Das einzige Problem ist, dass\G
auch 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.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.quelle
Haskell,
115112 BytesAnwendungsbeispiel:
Wie es funktioniert:
quelle
JavaScript
88827069 ZeichenAnwendungsbeispiel:
quelle
s=>/AUG(...)+?(?=(U(AA|AG|GA)|$))/.exec(s)[0].match(/.../g)
.Python 2, 185 Bytes
Erklärung Auf
i
Eingabe 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
quelle
MATL , 57 Bytes
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
BEARBEITEN (12. Juni 2016): Um sich an Änderungen in der Sprache anzupassen,
[]
sollte entfernt werden. Der unten stehende Link enthält diese ÄnderungProbieren Sie es online!
Erläuterung
Der Code basiert auf dem regulären Ausdruck
Das paßt Strings mit dem Starten
AUG
, mit Gruppen von drei Zeichen (...
) und in entweder endetUAA
,UAG
oderUGA
; 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.quelle
Ruby,
9795787562 BytesIch spiele nicht viel Golf, also bin ich sicher, dass es verbessert werden kann.
Edit:
StolaMartin Büttners exzellenten\B\G
Trick ausgeliehenquelle