RNA ist wie DNA ein Molekül, das in Zellen gefunden wird, die genetische Informationen kodieren. Es besteht aus Nukleotiden , die durch die Basen Adenin (A), Cytosin (C), Guanin (G) und Uracil (U) dargestellt werden. * Ein Codon ist eine Sequenz von drei Nukleotiden.
Proteine sind große Moleküle, die eine Vielzahl von Funktionen erfüllen, wie Keratin, das in Haaren und Nägeln vorkommt, und Hämoglobin, das Sauerstoff in Blutzellen transportiert. Sie bestehen aus Aminosäuren , die in RNA-Molekülen als Codons kodiert sind. Manchmal können verschiedene Codons für dieselbe Aminosäure codieren. Jede Aminosäure wird üblicherweise durch einen einzelnen Buchstaben dargestellt, zum Beispiel steht H für Histidin.
Können Sie es bei einer gegebenen Sequenz von ACGU
in den entsprechenden Proteinstring übersetzen?
* DNA besteht aus ACGT, wobei das T Thymin ist. Während der Transkription von DNA zu RNA wird Thymin durch Uracil ersetzt.
Eingang
Die Eingabe ist eine einzelne Zeichenfolge, die nur aus den Zeichen besteht ACGU
in Großbuchstaben besteht. Sie können entweder eine Funktion oder ein vollständiges Programm für diese Herausforderung schreiben.
Ausgabe
Sie können auswählen, ob eine Zeichenfolge gedruckt oder zurückgegeben werden soll (die letztere Option ist nur im Fall einer Funktion verfügbar).
Die Übersetzung sollte bei einem Start - Codon (beginnen AUG
, dargestellt als M
bei einem Stop - Codon (einer) und Ende UAA
, UAG
oder UGA
, dargestellt als *
). In vier Fällen ist die Eingabe möglicherweise ungültig:
- Die Eingabe beginnt nicht mit einem Startcodon
- Die Eingabe endet nicht mit einem Stoppcodon
- Die Länge der Eingabe ist kein Vielfaches von 3
- Die Eingabe enthält ein Stoppcodon, das nicht am Ende steht
In all diesen Fällen Error
sollte ausgegeben werden. Beachten Sie, dass im Gegensatz zu Stoppcodons Startcodons möglicherweise nach dem Anfang der Zeichenfolge angezeigt werden.
Andernfalls sollten Sie jedes Codon über die folgende RNA-Codontabelle in seine jeweilige Aminosäure umwandeln :
* UAA UAG UGA
A GCU GCC GCA GCG
C UGU UGC
D GAU GAC
E GAA GAG
F UUU UUC
G GGU GGC GGA GGG
H CAU CAC
I AUU AUC AUA
K AAA AAG
L UUA UUG CUU CUC CUA CUG
M AUG
N AAU AAC
P CCU CCC CCA CCG
Q CAA CAG
R CGU CGC CGA CGG AGA AGG
S UCU UCC UCA UCG AGU AGC
T ACU ACC ACA ACG
V GUU GUC GUA GUG
W UGG
Y UAU UAC
... und den übersetzten String ausgeben.
Beispiele
Ungültige Fälle:
<empty string> -> Error
AUG -> Error
UAA -> Error
AUGCUAG -> Error
AAAAAAA -> Error
GGGCACUAG -> Error
AUGAACGGA -> Error
AUGUAGUGA -> Error
AUGUUUGUUCCGUCGAAAUACCUAUGAACACGCUAA -> Error
Gültige Fälle:
AUGUGA -> M*
AUGAGGUGUAGCUGA -> MRCS*
AUGGGUGAGAAUGAAACGAUUUGCAGUUAA -> MGENETICS*
AUGCCAGUCGCACGAUUAGUUCACACGCUCUUGUAA -> MPVARLVHTLL*
AUGCUGCGGUCCUCGCAUCUAGCGUUGUGGUUAGGGUGUGUAACUUCGAGAACAGUGAGUCCCGUACCAGGUAGCAUAAUGCGAGCAAUGUCGUACGAUUCAUAG -> MLRSSHLALWLGCVTSRTVSPVPGSIMRAMSYDS*
AUGAAAAACAAGAAUACAACCACGACUAGAAGCAGGAGUAUAAUCAUGAUUCAACACCAGCAUCCACCCCCGCCUCGACGCCGGCGUCUACUCCUGCUUGAAGACGAGGAUGCAGCCGCGGCUGGAGGCGGGGGUGUAGUCGUGGUUUACUAUUCAUCCUCGUCUUGCUGGUGUUUAUUCUUGUUUUAA -> MKNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVVYYSSSSCWCLFLF*
Bearbeiten: Weitere Testfälle hinzugefügt
Wertung
Das ist Codegolf, also gewinnt der Code mit den wenigsten Bytes.
Hinweis: Ich bin kein Experte für Molekularbiologie. Wenn ich etwas falsch angegeben habe, können Sie mich jederzeit korrigieren :)
quelle
M
und endet*
.Antworten:
CJam (
97 93 9291 Bytes)Dies ist ein Port meiner GolfScript-Lösung mit einer leicht optimierten Hash-Funktion, da zu meiner Überraschung eine Sache, die CJam nicht von GolfScript übernommen hat, darin besteht, Strings als Arrays von ganzen Zahlen zu behandeln.
Dank Optimierungsvorschlägen wurden 6 Bytes eingespart (einschließlich zwei Bytes von etwas, von dem ich dachte, dass ich es versucht habe und es nicht funktioniert hat - nicht wahr).
quelle
q"GACU"f#3/{4b"GGEDAAVVRSKNTTMIRRQHPPLLWC*YSSLF"{_s"MW""I*"er}%=}%s_'*/(1<"M"=*Q="Error"@?
- 90Q
nicht[Q]
nur falsch.[Q]
dieQ
Änderung korrekt ist.AUGUAGUGA
[Q]
->Qa
JavaScript (ES6) 167
177Zeichen, in UTF8 als 167177Byte codiert... also ich hoffe alle sind glücklich.
Edit Tatsächlich ist ein Sonderfall für den letzten Block nicht zu kurz. Wenn die letzten 2 (oder 1) Zeichen nicht zugeordnet sind, endet die Ergebniszeichenfolge nicht mit '*', und das ergibt trotzdem einen Fehler.
Erklärt
Jedes Zeichen in einem Triplett kann 4 Werte haben, es gibt also genau 4 ^ 3 == 64 Tripletts. Die C-Funktion ordnet jedes Triplett einer Zahl zwischen 0 und 63 zu. Es ist keine Fehlerprüfung erforderlich, da Eingabezeichen nur ACGU sind.
Jedes Triplett ist einer Aminosäure zugeordnet, die durch einen einzelnen Buchstaben identifiziert wird. Wir können dies in einer 64-stelligen Zeichenfolge kodieren. Beginnen Sie mit der Codon Map, um die Zeichenfolge zu erhalten:
... erhält "KNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLEDEDAAAAGGGGVVVV * Y * YSSSS * CWCLFLF"
Wir können also die Eingabezeichenfolge scannen und dieselbe Logik wie die C-Funktion verwenden, um den Code 0..63 und aus dem Code den Aminosäurecharakter zu erhalten. Die Ersetzungsfunktion teilt die Eingabezeichenfolge in 3 Zeichenblöcke auf, wobei schließlich 1 oder 2 Zeichen nicht verwaltet werden (was zu einer ungültigen Ergebniszeichenfolge führt, die nicht mit '*' endet).
Überprüfen Sie zum Schluss mit einem regulären Ausdruck, ob die codierte Zeichenfolge gültig ist: Sie muss mit 'M' beginnen, darf kein '*' enthalten und muss mit '*' enden.
Prüfung in der FireBug / FireFox-Konsole
Ausgabe
quelle
C, 190 Bytes (Funktion)
199 bis194 Bytes (Programm)Ein paar Bytes gespart durch Verbesserung der Hash-Formel.
Hier ist ein lustiger Testfall:
Erläuterung
Das Triplett von Buchstaben wird in eine Zahl zur Basis 4 umgewandelt. Jeder Buchstabe ist wie folgt gehasht.
Dies gibt eine Zahl im Bereich
0..63
. Die Idee ist nun, eine Lookup-Tabelle zu verwenden, die der von edc65 und Optimizer verwendeten ähnelt. Der Hash ist jedoch so ausgelegt, dass G und A nebeneinander liegen und U und C nebeneinander liegen.Schauen Sie sich die Tabelle unter https://en.wikipedia.org/wiki/Genetic_code#RNA_codon_table an , dass bei den auf diese Weise geordneten Buchstaben im Allgemeinen das letzte Bit ignoriert werden kann. Mit Ausnahme von zwei Sonderfällen wird nur eine 32-stellige Nachschlagetabelle benötigt.
Siehe unten die ersten beiden Buchstaben und die entsprechenden Aminosäuren (wobei der dritte Buchstabe G / A und der dritte Buchstabe U / C ist). Korrekturen für die beiden Sonderfälle, die nicht in die 32-stellige Tabelle passen, sind fest codiert.
Kommentierter Code
In der Golfversion befindet sich der
i%3
Code in der inkrementellen Position derfor
Klammer, wird jedoch im kommentierten Code in eine besser lesbare Position verschoben.quelle
O
! Ich habe jedoch einen Testfall hinzugefügtMGENETICS*
, da dies das thematischste Wort ist, das ich machen kann: PCJam,
317 121104 BytesDies kann noch weiter golfen werden.
Aktualisiert den Abbildungsmechanismus der in edc65 Antwort verwendet. Obwohl ich es mir selbst ausgedacht habe, hat er mich geschlagen :)
UPDATE : Verkürzt die Codon-Tabelle durch Beobachtung des Musters.
Probieren Sie es hier online aus
quelle
GolfScript (103 Bytes)
Online-Demo (Hinweis: Die beiden größten Testfälle sind nicht enthalten, da sie in 15 Sekunden ausgeführt werden müssen.)
Präparation
Wie Steve Verrill im Sandkasten betonte, kann die Nachschlagetabelle auf 32 Elemente plus zwei Sonderfälle reduziert werden. Es stellt sich heraus , dass die Sonderfälle sowohl beinhalten Zeichen (
M
undW
jeweils) , die nur einmal auftreten, und mit der richtigen Zuordnung der Zeichen zu Basis 4 Stellen ist es möglich , die volle 64-Element - Lookup - Tabelle aus den 32 Elementen aufzubauen , indem sie ein Duplikat zu tun -und-tr
:Sobald wir die Dekodierung durchgeführt haben, ermöglicht die Validierung viele Ansätze. Der kürzeste, den ich gefunden habe, ist
quelle
M
die einer der Sonderfälle war, zu nutzen, um einen gültigen Start zu testen, aber das hat nicht geklappt. In dieser Zeichenfolge befinden sich noch 8 Paare identischer Buchstaben. Ich frage mich, ob sie als Kleinbuchstaben komprimiert werden können:g-->GG
a-->AA
usw. Wenn Dekomprimierung in weniger als 8 Zeichen erreicht werden kann, wäre es lohnenswert.Python, 473 Bytes
quelle
Python 2,
370358354 BytesDies ist ein sehr einfacher Ansatz ohne Komprimierung, bei dem nur versucht wird, die Informationen ziemlich dicht zu packen:
Bearbeiten: Einige Zeichen wurden auf Vorschlag von xnor abgeschabt.
quelle
s
rekursiv als kürzer schreibens=lambda x:x and[x[:3]]+s(x[3:])
.Scala (317 Zeichen)
Die Hauptfunktion ist
f
. Eine bessere Wahl wäre natürlich die Rückgabe vonOption[String]
.quelle
JavaScript (ES6), 143 Byte
Probieren Sie es online!
quelle