Parse RNA ke dalam kodon

18

pengantar

RNA adalah sepupu DNA yang kurang terkenal. Tujuan utamanya adalah untuk mengontrol produksi protein dalam sel melalui proses yang disebut translasi . Dalam tantangan ini, tugas Anda adalah mengimplementasikan bagian dari proses ini di mana RNA dipecah menjadi kodon .

Tantangan ini terkait secara tematis, tetapi berkonsentrasi pada bagian lain dari proses penerjemahan.

Kodon

Kita akan menganggap RNA sebagai string panjang di atas alfabet pasangan basa AUCG,. Dalam terjemahan, RNA dibagi menjadi potongan non-tumpang tindih dari tiga pasangan basa, yang disebut kodon. Proses dimulai pada kodon start , AUGdan berakhir pada kodon berhenti , salah UAA, UAGatau UGA. Setiap kodon (kecuali kodon stop) berhubungan dengan asam amino, dan string asam amino yang dihasilkan membentuk protein.

Memasukkan

Input Anda adalah string RNA yang tidak kosong.

Keluaran

Output Anda adalah daftar kodon di mana RNA dibagi, dalam format apa pun yang masuk akal. Dalam model yang disederhanakan ini, proses dimulai pada start kodon paling kiriAUG , yang termasuk dalam output. Itu berakhir ketika kodon stop ditemukan, atau ketika kita kehabisan RNA. Jika input tidak mengandung start kodon, output akan menjadi daftar kosong.

Contohnya

Pertimbangkan urutan input

ACAUGGAUGGACUGUAACCCCAUGC

Parsing dimulai pada kemunculan paling kiri AUG, pada indeks 2. Ini berlanjut sebagai berikut:

AC AUG GAU GGA CUG UAA CCCCAUGC
   *   ^   ^   ^   +

Kodon yang ditandai dengan *adalah kodon awal, dan yang ditandai dengan ^juga merupakan bagian dari output. Kodon stop ditandai dengan +. Output yang benar adalah

AUG,GAU,GGA,CUG

Untuk input yang lebih pendek

ACAUGGAUGGACUGU

prosesnya berjalan

AC AUG GAU GGA CUG U
   *   ^   ^   ^

Kali ini, kodon stop tidak ditemukan, sehingga proses berhenti ketika kami kehabisan pasangan basa. Outputnya sama seperti di atas.

Aturan dan penilaian

Anda dapat menulis program lengkap suatu fungsi. Hitungan byte terendah menang, dan celah standar tidak diizinkan.

Uji kasus

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
Zgarb
sumber
13
Hubungan DNA dengan RNA dengan protein pernah dijelaskan kepada saya dalam istilah komputasi yang bisa saya mengerti: DNA menyamakan dengan program pada hard disk; RNA sama dengan program yang dimuat ke dalam memori; dan protein sama dengan data keluaran yang dihasilkan sebagai hasil dari program yang berjalan.
Trauma Digital
4
Dogma biologi molekuler adalah "DNA membuat RNA membuat protein." Jadi DNA cukup langka, dan RNA kurang terkenal, tetapi jauh lebih umum. Protein paling umum terjadi.
Level River St
1
@DigitalTrauma: Sebagai ahli genetika, saya perlu menunjukkan bahwa analogi ini sangat tidak memadai untuk menggambarkan realitas bagaimana DNA bekerja. DNA bukanlah sesuatu yang mati menunggu untuk ditranskripsi menjadi RNA sehingga dapat melakukan sesuatu.
Jack Aidley
Apa yang sebenarnya terjadi dalam praktik jika sepotong mRNA berhenti sebelum stop kodon (seperti dalam contoh sederhana), yang berarti tidak ada stop triplet untuk dilepaskan oleh faktor pelepas?
Pasang kembali Monica - ζ--
1
@Jack konten hard disk belum tentu mati - upgrade, pembaruan otomatis, dll, meskipun tentu saja tidak sembuh sendiri sejauh saya mengerti DNA menjadi. Tapi Anda benar - Ini analogi yang lemah. Namun saya pikir itu membuat diri non-genetika saya sedikit lebih dekat dengan pemahaman awam
Digital Trauma

Jawaban:

9

Retina , 39 38 32 30 byte

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

Linefeed tambahan sangat penting.

Output sebagai daftar yang dipisahkan oleh linefeed.

Cobalah online.

Penjelasan

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

Ini adalah tahap kecocokan yang mengubah input menjadi daftar semua pertandingan yang terpisah (karena !). Regex itu sendiri cocok dengan setiap kodon mulai dari yang pertama AUG. Kami mencapai ini dengan dua opsi terpisah. AUGcocok tanpa syarat, sehingga dapat memulai daftar pertandingan. Pertandingan kedua dapat berupa kodon apa saja ( ...cocok dengan tiga karakter apa pun), tetapi \Gjangkar khusus yang memastikan bahwa ini hanya dapat cocok tepat setelah pertandingan lain. Satu-satunya masalah adalah itu \Gjuga cocok pada awal string, yang tidak kita inginkan. Karena input hanya terdiri dari karakter kata, kami menggunakan \B(posisi apa pun yang bukan batas kata) untuk memastikan bahwa kecocokan ini tidak digunakan pada awal input.

U(AA|AG|GA)\D*

Ini menemukan kodon stop pertama, cocok U(AA|AG|GA)serta semuanya setelahnya, dan menghapusnya dari string. Karena tahap pertama memecah kodon menjadi garis yang terpisah, kita tahu bahwa kecocokan ini selaras dengan kodon awal. Kami menggunakan \D(non-digit) untuk mencocokkan karakter apa pun, karena .tidak akan melewati umpan baris, dan input tidak akan berisi digit.

Martin Ender
sumber
5

Haskell, 115 112 byte

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

Contoh penggunaan:

*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"]

Bagaimana itu bekerja:

                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 
nimi
sumber
1

JavaScript 88 82 70 69 karakter

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

Contoh Penggunaan:

(s=>/AUG(...)+?(?=(U(AA|AG|GA)|$))/.exec(s)[0].match(/.../g).join(","))("ACAUGGAUGGACUGUAACCCCAUGC")
Benjamin Gruenbaum
sumber
Bukankah ini gagal untuk input tanpa berhenti kodon?
Flambino
1
Anda benar, saya tidak melihat itu pilihan, memperbaiki
Benjamin Gruenbaum
Coba s=>/AUG(...)+?(?=(U(AA|AG|GA)|$))/.exec(s)[0].match(/.../g).
Mama Fun Roll
Masih gagal untuk menghentikan kodon. (Coba uji case 3)
user81655
1

Python 2, 185 byte

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)

Penjelasan Set ito input. Membaginya dari 'AUG' hingga akhir. Dibagi menjadi string tiga. Periksa apakah berhenti kodon, dan potong.

Coba di sini

TanMath
sumber
1

MATL , 57 byte

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

Ini menggunakan versi saat ini (9.3.1) dari bahasa / kompiler.

Input dan output melalui stdin dan stdout. Output dipisahkan oleh linebreak.

Contoh

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

EDIT (12 Juni 2016): untuk beradaptasi dengan perubahan bahasa, []harus dihapus. Tautan di bawah ini termasuk modifikasi itu

Cobalah online!

Penjelasan

Kode ini didasarkan pada ekspresi reguler

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

Ini pertandingan substring dimulai dengan AUG, mengandung kelompok tiga karakter ( ...) dan berakhir baik UAA, UAGatau UGA; atau berakhir di akhir string, dan dalam hal ini mungkin ada satu grup yang tidak lengkap terakhir ( .?.?$). Lookahead ( (?=...)) digunakan sehingga stop kodon bukan bagian dari pertandingan. Pencocokan adalah lazy ( *?) untuk menyelesaikan pada kodon pemberhentian pertama yang ditemukan, jika ada.

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
Luis Mendo
sumber
0

Ruby, 97 95 78 75 62 byte

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

Saya tidak banyak bermain golf, jadi saya yakin ini bisa ditingkatkan.

Edit: mencuri Borrowed Martin Büttner ini sangat baik \B\Gtrik

Flambino
sumber