Ми працюємо в біоінженерній компанії, яка спеціалізується на розробці терапевтичних рішень.
Наша команда щойно отримала новий проєкт: розробити таргетну терапію для рідкісного типу раку.
Усе це дуже складно, але основна ідея в тому, що іноді організм людини виробляє занадто багато певного білка. Це може спричинити найрізноманітніші проблеми.
Але якщо створити дуже специфічну молекулу (яку називають мікроРНК), вона може завадити виробленню цього білка.
Цю техніку називають РНК-інтерференцією.
Наше завдання - визначити комплемент РНК для заданої послідовності ДНК.
І ланцюги ДНК, і ланцюги РНК - це послідовності нуклеотидів.
Чотири нуклеотиди, що містяться в ДНК, - це аденін (A), цитозин (C), гуанін (G) і тимін (T).
Чотири нуклеотиди, що містяться в РНК, - це аденін (A), цитозин (C), гуанін (G) і урацил (U).
Для заданого ланцюга ДНК його транскрибований ланцюг РНК утворюється заміною кожного нуклеотиду на його комплемент:
G -> C
C -> G
T -> A
A -> U
Якщо ми хочемо подивитися, як структуровані вхідні та вихідні дані, погляньмо на приклади в наборі тестів.
Використовуючи приватні поля у структурах із публічними функціями new, що повертають Option або Result (як тут із DNA::new та RNA::new), ми можемо гарантувати правильність внутрішнього представлення DNA. Оскільки кожен коректний рядок тексту (англ. string) DNA має коректний рядок RNA, нам не потрібно повертати Result/Option з into_rna.
Це пояснює сигнатури типів, які ми побачимо в тестах.
І DNA::new(), і RNA::new() повертають тип Result<Self, usize>, де тип помилки usize позначає індекс першого некоректного символу (індекс символу, а не utf8).