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 , AUG
dan berakhir pada kodon berhenti , salah UAA
, UAG
atau 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
Jawaban:
Retina ,
39383230 byteLinefeed tambahan sangat penting.
Output sebagai daftar yang dipisahkan oleh linefeed.
Cobalah online.
Penjelasan
Ini adalah tahap kecocokan yang mengubah input menjadi daftar semua pertandingan yang terpisah (karena
!
). Regex itu sendiri cocok dengan setiap kodon mulai dari yang pertamaAUG
. Kami mencapai ini dengan dua opsi terpisah.AUG
cocok tanpa syarat, sehingga dapat memulai daftar pertandingan. Pertandingan kedua dapat berupa kodon apa saja (...
cocok dengan tiga karakter apa pun), tetapi\G
jangkar khusus yang memastikan bahwa ini hanya dapat cocok tepat setelah pertandingan lain. Satu-satunya masalah adalah itu\G
juga 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.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.sumber
Haskell,
115112 byteContoh penggunaan:
Bagaimana itu bekerja:
sumber
JavaScript
88827069 karakterContoh Penggunaan:
sumber
s=>/AUG(...)+?(?=(U(AA|AG|GA)|$))/.exec(s)[0].match(/.../g)
.Python 2, 185 byte
Penjelasan Set
i
to input. Membaginya dari 'AUG' hingga akhir. Dibagi menjadi string tiga. Periksa apakah berhenti kodon, dan potong.Coba di sini
sumber
MATL , 57 byte
Ini menggunakan versi saat ini (9.3.1) dari bahasa / kompiler.
Input dan output melalui stdin dan stdout. Output dipisahkan oleh linebreak.
Contoh
EDIT (12 Juni 2016): untuk beradaptasi dengan perubahan bahasa,
[]
harus dihapus. Tautan di bawah ini termasuk modifikasi ituCobalah online!
Penjelasan
Kode ini didasarkan pada ekspresi reguler
Ini pertandingan substring dimulai dengan
AUG
, mengandung kelompok tiga karakter (...
) dan berakhir baikUAA
,UAG
atauUGA
; 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.sumber
Ruby,
9795787562 byteSaya tidak banyak bermain golf, jadi saya yakin ini bisa ditingkatkan.
Edit:
mencuriBorrowed Martin Büttner ini sangat baik\B\G
triksumber