Du arbeitest für ein Bioengineering-Unternehmen, das sich auf die Entwicklung therapeutischer Lösungen spezialisiert hat.
Dein Team hat gerade ein neues Projekt bekommen: eine gezielte Therapie für eine seltene Krebsart entwickeln.
Das Ganze ist sehr kompliziert, aber die Grundidee ist, dass der Körper manchmal zu viel von einem bestimmten Protein produziert. Das kann jede Menge Schaden anrichten.
Aber wenn du ein ganz bestimmtes Molekül erzeugst (eine sogenannte micro-RNA), kann es verhindern, dass das Protein überhaupt entsteht.
Diese Technik heißt RNA-Interferenz.
Deine Aufgabe ist es, das RNA-Komplement einer gegebenen DNA-Sequenz zu bestimmen.
Sowohl DNA- als auch RNA-Stränge sind eine Abfolge von Nukleotiden.
Die vier Nukleotide in der DNA sind Adenin (A), Cytosin (C), Guanin (G) und Thymin (T).
Die vier Nukleotide in der RNA sind Adenin (A), Cytosin (C), Guanin (G) und Uracil (U).
Aus einem DNA-Strang entsteht der transkribierte RNA-Strang, indem jedes Nukleotid durch sein Komplement ersetzt wird:
G -> C
C -> G
T -> A
A -> U
Wenn du sehen möchtest, wie die Ein- und Ausgaben aufgebaut sind, wirf einen Blick auf die Beispiele in der Testsuite.
Indem wir in Structs private Felder verwenden und öffentliche new-Funktionen anbieten, die Option oder Result zurückgeben (wie hier bei DNA::new und RNA::new), können wir garantieren, dass die interne Darstellung von DNA korrekt ist. Da jeder gültige DNA-String einen gültigen RNA-String hat, müssen wir aus into_rna kein Result/Option zurückgeben.
Das erklärt die Typsignaturen, die du in den Tests siehst.
Die Rückgabetypen von DNA::new() und RNA::new() sind beide Result<Self, usize>, wobei der Fehlertyp usize den Index des ersten ungültigen Zeichens angibt (Zeichenindex, nicht utf8).
Melde dich bei Exercism an, um Rust mit 99 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.