РНК , как и ДНК, представляет собой молекулу, обнаруженную в клетках, кодирующих генетическую информацию. Он состоит из нуклеотидов , которые представлены основаниями аденин (A), цитозин (C), гуанин (G) и урацил (U). * Кодон представляет собой последовательность из трех нуклеотидов.
Белки - это большие молекулы, которые выполняют широкий спектр функций, такие как кератин, который содержится в волосах и ногтях, и гемоглобин, который переносит кислород в клетках крови. Они состоят из аминокислот , которые кодируются в виде кодонов в молекулах РНК. Иногда разные кодоны могут кодировать одну и ту же аминокислоту. Каждая аминокислота обычно представлена одной буквой, например, H обозначает гистидин.
Учитывая последовательность ACGU
, можете ли вы перевести ее в соответствующую строку белка?
* ДНК состоит из ACGT, где T - тимин. Во время транскрипции ДНК в РНК тимин заменяется урацилом.
вход
Ввод будет одной строкой, состоящей только из символов ACGU
в верхнем регистре. Вы можете написать либо функцию, либо полную программу для этой задачи.
Выход
Вы можете выбрать вывод через печать или возврат строки (последний вариант доступен только в случае функции).
Перевод следует начинать на старте - кодоне ( AUG
, представлена в виде M
) и конце в стопе - кодоне (один из UAA
, UAG
или UGA
, представлен в виде *
). В четырех случаях ввод может быть недействительным:
- Ввод не начинается со стартового кодона
- Ввод не заканчивается стоп-кодоном
- Длина входа не кратна 3
- Вход содержит кодон остановки где-то кроме конца
Во всех этих случаях Error
должны быть выведены. Обратите внимание, что, в отличие от стоп-кодонов, стартовые кодоны могут появляться после начала строки.
В противном случае вы должны преобразовать каждый кодон в соответствующую ему аминокислоту через следующую таблицу кодирования РНК :
* 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
... и вывести переведенную строку.
Примеры
Неверные случаи:
<empty string> -> Error
AUG -> Error
UAA -> Error
AUGCUAG -> Error
AAAAAAA -> Error
GGGCACUAG -> Error
AUGAACGGA -> Error
AUGUAGUGA -> Error
AUGUUUGUUCCGUCGAAAUACCUAUGAACACGCUAA -> Error
Допустимые случаи:
AUGUGA -> M*
AUGAGGUGUAGCUGA -> MRCS*
AUGGGUGAGAAUGAAACGAUUUGCAGUUAA -> MGENETICS*
AUGCCAGUCGCACGAUUAGUUCACACGCUCUUGUAA -> MPVARLVHTLL*
AUGCUGCGGUCCUCGCAUCUAGCGUUGUGGUUAGGGUGUGUAACUUCGAGAACAGUGAGUCCCGUACCAGGUAGCAUAAUGCGAGCAAUGUCGUACGAUUCAUAG -> MLRSSHLALWLGCVTSRTVSPVPGSIMRAMSYDS*
AUGAAAAACAAGAAUACAACCACGACUAGAAGCAGGAGUAUAAUCAUGAUUCAACACCAGCAUCCACCCCCGCCUCGACGCCGGCGUCUACUCCUGCUUGAAGACGAGGAUGCAGCCGCGGCUGGAGGCGGGGGUGUAGUCGUGGUUUACUAUUCAUCCUCGUCUUGCUGGUGUUUAUUCUUGUUUUAA -> MKNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVVYYSSSSCWCLFLF*
Изменить: Добавлено больше тестов
счет
Это код гольф, поэтому код в наименьшем количестве байтов выигрывает.
Примечание: я не специалист по молекулярной биологии, поэтому не стесняйтесь поправлять меня, если я что-то неверно уточнил :)
источник
M
и заканчивается*
.Ответы:
CJam (
97 93 9291 байт)Это порт моего решения GolfScript с немного подправленной хэш-функцией, потому что, к моему удивлению, CJam не позаимствовал у GolfScript обработку строк как массивов целых чисел.
6 байтов сэкономлено благодаря предложениям от Оптимизатора (включая два байта из того, что я думал, что попробовал и не сработало - ага).
источник
q"GACU"f#3/{4b"GGEDAAVVRSKNTTMIRRQHPPLLWC*YSSLF"{_s"MW""I*"er}%=}%s_'*/(1<"M"=*Q="Error"@?
- 90Q
а не[Q]
просто неверно.[Q]
чтобыQ
изменить это правильно.AUGUAGUGA
[Q]
->Qa
JavaScript (ES6) 167
177символов, закодированных в UTF8 как 167177байтов... так что я надеюсь, что все счастливы.
Редактировать На самом деле, нет необходимости в специальном случае, если последний блок слишком короткий. Если последние 2 (или 1) символа не отображаются, результирующая строка не заканчивается на «*», и это в любом случае выдает ошибку.
Разъяснения
Каждый символ в триплете может иметь 4 значения, поэтому существует ровно 4 ^ 3 == 64 триплета. Функция C отображает каждый триплет на число от 0 до 63. Проверка ошибок не требуется, поскольку входные символы являются только ACGU.
Каждый триплет отображается на аминокислоту, идентифицированную одним символом. Мы можем закодировать это в 64-символьную строку. Чтобы получить строку, начните с карты кодонов:
... получение "KNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVV * Y * YSSSS * CWCLFLF"
Таким образом, мы можем отсканировать входную строку и использовать ту же логику функции C, чтобы получить код 0..63 и из кода символ аминокислоты. Функция замены будет разбивать входную строку на 3 блока символов, в конечном счете оставляя 1 или 2 символа неуправляемыми (что приведет к недопустимой строке результата, не заканчивающейся на «*»).
Наконец, проверьте правильность закодированной строки с помощью регулярного выражения: она должна начинаться с «M», не должна содержать «*» и заканчиваться «*»
Тест в консоли FireBug / FireFox
Выход
источник
C 190 байт (функция)
199194 байта (программа)Сохранено несколько байтов за счет улучшения формулы хэша.
Вот забавный тестовый пример:
объяснение
Тройка букв преобразуется в основную цифру 4. Каждое письмо хэшируется следующим образом.
Это дает число в диапазоне
0..63
. Идея теперь состоит в том, чтобы использовать справочную таблицу, аналогичную тем, которые используются edc65 и Optimizer. Однако хэш разработан так, что G и A находятся рядом друг с другом, а U и C находятся рядом друг с другом.Глядя на таблицу по адресу https://en.wikipedia.org/wiki/Genetic_code#RNA_codon_table , мы видим, что с буквами, упорядоченными таким образом, обычно последний бит можно игнорировать. Требуется только таблица поиска из 32 символов, за исключением двух особых случаев.
См. Ниже первые две буквы и соответствующие аминокислоты (где 3-я буква - G / A, а где 3-я буква - U / C). Исправления для двух особых случаев, которые не соответствуют 32-символьной таблице, жестко закодированы.
Код комментария
В версии для игры в гольф
i%3
код находится в увеличенной позицииfor
скобки, но он перемещается в более читаемую позицию в закомментированном коде.источник
O
! Я добавил тестовый примерMGENETICS*
, потому что это самое тематическое слово, которое я могCJam,
317 121104 байтаЭто все еще может быть в гольфе дальше.
Обновлен механизм отображения на тот, который использовался в ответе edc65. Несмотря на то, что я придумал это сам, он победил меня в этом :)
ОБНОВИТЬ : Сократил карту таблицы кодонов, наблюдая образец в ней.
Попробуйте это онлайн здесь
источник
GolfScript (103 байта)
Онлайн демо (NB не включает два самых больших тестовых случая, потому что он должен быть запущен за 15 секунд).
рассечение
Как указал Стив Веррилл в песочнице, справочную таблицу можно уменьшить до 32 элементов плюс два особых случая. Оказывается, что в особых случаях используются символы (
M
иW
соответственно), которые встречаются только один раз, и при правильном сопоставлении символов с четырьмя основными цифрами можно построить полную 64-элементную таблицу поиска из 32 элементов, выполнив дубликат. -и-tr
:Затем, после того как мы выполнили декодирование, проверка допускает множество подходов. Самое короткое, что я нашел, это
источник
M
был один из особых случаев, чтобы проверить правильность старта, но это не сработало. В этой строке еще 8 пар одинаковых букв. Интересно, могут ли они быть сжаты строчными буквамиg-->GG
a-->AA
и т. Д. Если декомпрессия может быть выполнена до 8 символов, это будет целесообразно.Python, 473 байта
источник
Python 2,
370358354 байтаЭто очень простой подход без сжатия, просто попытка упаковать информацию довольно плотно:
Изменить: сбрил несколько символов в соответствии с предложением xnor.
источник
s
короче какs=lambda x:x and[x[:3]]+s(x[3:])
.Скала (317 символов)
Основная функция есть
f
. Конечно, лучшим выбором будет вернутьOption[String]
.источник
JavaScript (ES6), 143 байта
Попробуйте онлайн!
источник