Вступление
РНК является менее известным двоюродным братом ДНК. Его основная цель - контролировать производство белков в клетках с помощью процесса, называемого трансляцией . В этой задаче ваша задача - реализовать часть этого процесса, где РНК делится на кодоны .
Эта проблема тематически связана, но концентрируется на другой части процесса перевода.
кодоны
Мы будем думать о РНК как о длинной строке над алфавитом пар оснований AUCG
. В переводе РНК делится на непересекающиеся куски из трех пар оснований, называемых кодонами. Процесс начинается на старт - кодона , AUG
и заканчивается на стоп - кодон , один из UAA
, UAG
или UGA
. Каждый кодон (кроме стоп-кодонов) соответствует аминокислоте, и получающаяся последовательность аминокислот образует белок.
вход
Ваш ввод является непустой строкой РНК.
Выход
Ваш вывод - это список кодонов, в которых РНК разделена, в любом приемлемом формате. В этой упрощенной модели процесс начинается с крайнего левого стартового кодона AUG
, который включен в выходные данные. Он заканчивается, когда встречается стоп-кодон или когда у нас заканчивается РНК. Если на входе нет стартового кодона, на выходе должен быть пустой список.
Примеры
Рассмотрим последовательность ввода
ACAUGGAUGGACUGUAACCCCAUGC
Разбор начинается с самого левого вхождения AUG
, в индексе 2. Он продолжается следующим образом:
AC AUG GAU GGA CUG UAA CCCCAUGC
* ^ ^ ^ +
Кодон, помеченный знаком, *
является стартовым кодоном, и те, которые отмечены знаком ^
, также являются частью выходных данных. Стоп-кодон отмечен значком +
. Правильный вывод
AUG,GAU,GGA,CUG
Для более короткого ввода
ACAUGGAUGGACUGU
процесс идет
AC AUG GAU GGA CUG U
* ^ ^ ^
На этот раз стоп-кодон не встречается, поэтому процесс останавливается, когда у нас заканчиваются пары оснований. Вывод такой же, как указано выше.
Правила и оценки
Вы можете написать полную программу функции. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.
Контрольные примеры
GGUACGGAUU ->
GGCGAAAUCGAUGCC -> AUG
ACAUGGAUGGACUGU -> AUG,GAU,GGA,CUG
AUGACGUGAUGCUUGA -> AUG,ACG
UGGUUAGAAUAAUGAGCUAG -> AUG,AGC
ACAUGGAUGGACUGUAACCCCAUGC -> AUG,GAU,GGA,CUG
CUAAGAUGGCAUGAGUAAUGAAUGGAG -> AUG,GCA
AAUGGUUUAAUAAAUGUGAUAUGAUGAUA -> AUG,GUU
UGUCACCAUGUAAGGCAUGCCCAAAAUCAG -> AUG
UAUAGAUGGUGAUGAUGCCAUGAGAUGCAUGUUAAU -> AUG,GUG,AUG,AUG,CCA
AUGCUUAUGAAUGGCAUGUACUAAUAGACUCACUUAAGCGGUGAUGAA -> AUG,CUU,AUG,AAU,GGC,AUG,UAC
UGAUAGAUGUAUGGAUGGGAUGCUCAUAGCUAUAAAUGUUAAAGUUAGUCUAAUGAUGAGUAGCCGAUGGCCUAUGAUGCUGAC -> AUG,UAU,GGA,UGG,GAU,GCU,CAU,AGC,UAU,AAA,UGU
Ответы:
Сетчатка ,
39383230 байтКонечный перевод строки является значительным.
Вывести в виде списка, разделенного переводом строки.
Попробуйте онлайн.
объяснение
Это стадия совпадения, которая превращает ввод в список всех совпадений, разделенных переводом строки (из-за
!
). Само регулярное выражение соответствует каждому кодону, начиная с первогоAUG
. Мы достигаем этого с двумя отдельными вариантами.AUG
совпадения безоговорочно, так что он может начать список совпадений. Второе совпадение может быть любым кодоном (...
соответствует любым трем символам), но\G
это специальный якорь, который гарантирует, что он может совпадать только сразу после другого совпадения. Единственная проблема состоит в том, что\G
также совпадает в начале строки, что нам не нужно. Поскольку входные данные состоят только из символов слова, мы используем\B
(любую позицию, не являющуюся границей слова), чтобы гарантировать, что это совпадение не используется в начале ввода.Он находит первый стоп-кодон, соответствующий ему, а
U(AA|AG|GA)
также все после него и удаляет его из строки. Поскольку на первом этапе кодоны разбиты на отдельные строки, мы знаем, что это совпадение правильно выровнено с начальным кодоном. Мы используем\D
(не цифры), чтобы соответствовать любому символу, так.
как не будет проходить после перевода строки, и ввод не будет содержать цифр.источник
Haskell,
115112 байтовПример использования:
Как это устроено:
источник
JavaScript
88827069 символовПример использования:
источник
s=>/AUG(...)+?(?=(U(AA|AG|GA)|$))/.exec(s)[0].match(/.../g)
.Python 2, 185 байт
Набор объяснений
i
для ввода. Разделите его от 'AUG' до конца. Разделить на три строки. Проверьте, не остановился ли кодон, и отрежьте.Попробуй здесь
источник
MATL , 57 байт
При этом используется текущая версия (9.3.1) языка / компилятора.
Ввод и вывод осуществляется через stdin и stdout. Вывод разделен переносами строк.
пример
РЕДАКТИРОВАТЬ (12 июня 2016 г.): чтобы адаптироваться к изменениям в языке,
[]
должны быть удалены. Ссылка ниже включает эту модификациюПопробуйте онлайн!
объяснение
Код основан на регулярном выражении
Это соответствует подстроки, начинающиеся с
AUG
, содержащие группы из трех символов (...
) и заканчивающиеся в любомUAA
,UAG
илиUGA
; или заканчивается в конце строки, и в этом случае может быть одна последняя неполная группа (.?.?$
). Lookahead ((?=...)
) используется для того, чтобы стоп-кодоны не были частью совпадения. Соответствие выполняется lazy (*?
), чтобы завершить поиск первого найденного стоп-кодона, если он есть.источник
Рубин,
9795787562 байтаЯ не очень много играю в гольф, поэтому я уверен, что это можно улучшить.
Редактировать:
укралотличную\B\G
уловку Мартина Бюттнераисточник