Trabalhas numa empresa de bioengenharia especializada no desenvolvimento de soluções terapêuticas.
A tua equipa acaba de receber um novo projeto para desenvolver uma terapia dirigida para um tipo raro de cancro.
É tudo muito complicado, mas a ideia básica é que, por vezes, o corpo das pessoas produz demasiada quantidade de uma determinada proteína. Isso pode causar todo o tipo de estragos.
Mas se conseguires criar uma molécula muito específica (chamada micro-RNA), essa molécula pode impedir que a proteína seja produzida.
Esta técnica chama-se interferência de RNA.
A tua tarefa é determinar o complemento de RNA de uma determinada sequência de DNA.
Tanto as cadeias de DNA como as de RNA são uma sequência de nucleótidos.
Os quatro nucleótidos que existem no DNA são a adenina (A), a citosina (C), a guanina (G) e a timina (T).
Os quatro nucleótidos que existem no RNA são a adenina (A), a citosina (C), a guanina (G) e o uracilo (U).
Dada uma cadeia de DNA, a sua cadeia de RNA transcrita forma-se substituindo cada nucleótido pelo seu complemento:
G -> C
C -> G
T -> A
A -> U
Se quiseres ver como os valores de entrada e de saída estão estruturados, dá uma vista de olhos pelos exemplos da suite de testes.
Ao usar campos privados em structs com funções new públicas que devolvem
Option ou Result (como aqui acontece com DNA::new e RNA::new),
conseguimos garantir que a representação interna de DNA está correta. Como
todas as strings de DNA válidas têm uma string de RNA válida, não precisamos de
devolver um Result/Option a partir de into_rna.
É isto que explica as assinaturas de tipo que vais ver nos testes.
Os tipos devolvidos tanto por DNA::new() como por RNA::new() são Result<Self, usize>,
em que o tipo de erro usize representa o índice do primeiro caráter inválido
(índice de char, não utf8).
Inscreve-te no Exercism para aprenderes e dominares Rust com 99 exercícios, e mentoria humana real, tudo grátis.