Розбір РНК на кодони


18

Вступ

РНК - менш відомий двоюрідний брат ДНК. Його головне призначення - контролювати вироблення білків у клітинах за допомогою процесу, який називається трансляцією . У цьому виклику ваше завдання полягає в тому, щоб реалізувати частину цього процесу, де РНК розбита на кодони .

Цей виклик є тематично пов'язаним, але зосереджений на іншій частині процесу перекладу.

Кодони

Ми будемо думати про РНК у вигляді довгого рядка над алфавітом базових пар, 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

13
Взаємозв'язок ДНК з РНК і білком колись мені пояснили в обчислювальних термінах, які я міг зрозуміти: ДНК прирівнюється до програми на жорсткому диску; РНК прирівнюється до тієї програми, завантаженої в пам'ять; а білок прирівнюється до вихідних даних, отриманих в результаті виконання цієї програми.
Цифрова травма

4
Догма молекулярної біології - "ДНК робить РНК робить білком". Тож ДНК є досить рідкісною, а РНК - менш відомою, але набагато частішою. Білок є найбільш поширеним з усіх.
Рівень р. Св.

1
@DigitalTrauma: Як генетик я повинен зазначити, що ця аналогія є надзвичайно недостатнім для опису реальності того, як працює ДНК. ДНК не є якоюсь мертвою річчю, яка чекає переписання в РНК, щоб вона могла щось зробити.
Джек Едлі

Що насправді відбувається на практиці, якщо шматочок мРНК закінчується перед стоп-кодоном (як у простому прикладі), тобто немає триплет зупинки для фактору вивільнення, який би прив'язувався до?
Відновіть Моніку - ζ--

1
Вміст жорсткого диска @Jack не обов'язково - теж мертві речі - оновлення, автоматичне оновлення тощо, хоча, звичайно, не самолікування настільки, наскільки я розумію, ДНК. Але ти маєш рацію - це слабка аналогія. Однак я думаю, що це моє негенетичне самоврядування трохи наблизилось до розуміння мирян
Digital Trauma

Відповіді:


9

Сітківка , 39 38 32 30 байт

M!`AUG|\B\G...
U(AA|AG|GA)\D*

Подача підводного каналу є значною.

Виведіть у вигляді списку, розділеного рядковими каналами.

Спробуйте в Інтернеті.

Пояснення

M!`AUG|\B\G...

Це етап матчу, який перетворює вхід у список розділених підведенням ліній для всіх збігів (за рахунок !). Сам регулярний вираз відповідає кожному кодону, починаючи з першого AUG. Ми досягаємо цього за допомогою двох окремих варіантів. AUGзбігається беззастережно, так що він може запустити список відповідностей. Другий матч може бути будь-яким кодоном ( ...відповідає будь-яким трьом символам), але \Gце спеціальний якор, який гарантує, що він може відповідати лише після іншого матчу. Єдина проблема полягає в тому, що вони \Gтакож відповідають на початку рядка, чого ми не хочемо. Оскільки вхід складається лише з символів слова, ми використовуємо \B(будь-яке положення, яке не є межею слова), щоб переконатися, що ця відповідність не використовується на початку введення.

U(AA|AG|GA)\D*

Це знаходить перший стоп-кодон, відповідний як U(AA|AG|GA)і все після нього, і виймає його з рядка. Оскільки перша стадія розділила кодони на окремі рядки, ми знаємо, що ця відповідність правильно узгоджена зі стартовим кодоном. Ми використовуємо \D(нецифрові) для того, щоб відповідати будь-якому символу, оскільки .він не проходитиме повз стрічкових каналів, а введення не буде містити цифр.


5

Хаскелл, 115 112 байт

import Data.Lists
fst.break(\e->elem e["UAA","UAG","UGA"]||length e<3).chunksOf 3.snd.spanList((/="AUG").take 3)

Приклад використання:

*Main> ( fst.break(\e->elem e["UAA","UAG","UGA"]||length e<3).chunksOf 3.snd.spanList((/="AUG").take 3) ) "AUGCUUAUGAAUGGCAUGUACUAAUAGACUCACUUAAGCGGUGAUGAA"
["AUG","CUU","AUG","AAU","GGC","AUG","UAC"]

Як це працює:

                spanList((/="AUG").take 3)  -- split input at the first "AUG"
             snd                            -- take 2nd part ("AUG" + rest)
     chunksOf 3                             -- split into 3 element lists
fst.break(\e->                              -- take elements from this list
           elem e["UAA","UAG","UGA"]||      -- as long as we don't see end codons
           length e<3)                      -- or run out of full codons 

1

JavaScript 88 82 70 69 символів

s=>/AUG(...)+?(?=(U(AA|AG|GA)|$))/.exec(s)[0].match(/.../g).join(",")

Приклад використання:

(s=>/AUG(...)+?(?=(U(AA|AG|GA)|$))/.exec(s)[0].match(/.../g).join(","))("ACAUGGAUGGACUGUAACCCCAUGC")

Не вдається це ввести без стоп-кодона?
Фламбіно

1
Ви маєте рацію, я не бачив, що це був варіант, виправлення
Бенджамін Груенбаум

Спробуйте s=>/AUG(...)+?(?=(U(AA|AG|GA)|$))/.exec(s)[0].match(/.../g).
Mama Fun Roll

Ще не вдається для зупинки кодонів. (Спробуйте тестовий випадок 3)
user81655

1

Python 2, 185 байт

i=input()
o=[]
if i.find('AUG')>=0:i=map(''.join,zip(*[iter(i[i.find('AUG'):])]*3))
else:print "";exit()
for j in i:
 if j not in['UGA','UAA','UAG']:o+=[j]
 else:break
print ','.join(o)

Пояснення Встановити iдля введення. Розділіть його від "СЕРВНЯ" до кінця. Розбийте на три струни. Перевірте, чи зупиняєте кодон, і виріжте.

Спробуйте тут


1

MATL , 57 байт

j'AUG(...)*?(?=(UAA|UAG|UGA|.?.?$))'XXtn?1X)tnt3\-:)3[]e!

Для цього використовується поточна версія (9.3.1) мови / компілятора.

Введення та вихід проходять через stdin та stdout. Вихід розділений рядковими перервами.

Приклад

>> matl
 > j'AUG(...)*?(?=(UAA|UAG|UGA|.?.?$))'XXtn?1X)tnt3\-:)3[]e!
 >
> ACAUGGAUGGACUGUAACCCCAUGC
AUG
GAU
GGA
CUG

EDIT (12 червня 2016 р.): Щоб адаптуватись до змін у мові, її []слід видалити. Посилання нижче включає цю зміну

Спробуйте в Інтернеті!

Пояснення

Код заснований на регулярному виразі

AUG(...)*?(?=(UAA|UAG|UGA|.?.?$))

Це відповідає підрядка , що починаються з AUG, містять групи з трьох символів ( ...) і закінчуються в будь-якому UAA, UAGабо UGA; або закінчується в кінці рядка, і в цьому випадку може бути одна остання неповна група ( .?.?$). Lookahead ( (?=...)) використовується так, що стоп-кодони не є частиною відповідності. Збіг лінивий ( *?), щоб закінчити на знайденому кодоні першої зупинки, якщо такий є.

j                                     % input string
'AUG(...)*?(?=(UAA|UAG|UGA|.?.?$))'   % regex
XX                                    % apply it. Push cell array of matched substrings
tn?                                   % if non-empty
1X)                                   % get first substring
tnt3\-:)                              % make length the largest possible multiple of 3
3[]e!                                 % reshape into rows of 3 columns
                                      % implicit endif
                                      % implicit display

0

Рубі, 97 95 78 75 62 байт

->(r){r.scan(/AUG|\B\G.../).join(?,).sub(/,U(AA|AG|GA).*/,'')}

Я не багато гольфу, тому впевнений, що це можна покращити.

Edit: Вкрав Запозичені відмінний Martin Büttner в \B\Gтрик

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.