RNA'yı kodonlara ayrıştırma


18

Giriş

RNA, DNA'nın daha az ünlü kuzenidir. Temel amacı, çeviri adı verilen bir süreçle hücrelerdeki protein üretimini kontrol etmektir . Bu zorlukta göreviniz, RNA'nın kodonlara bölündüğü bu sürecin bir kısmını uygulamaktır .

Bu zorluk tematik olarak ilişkilidir, ancak çeviri sürecinin başka bir bölümüne odaklanır.

kodonları

RNA'yı baz çiftlerinin alfabesi üzerinde uzun bir dizi olarak düşüneceğiz AUCG. Çeviride RNA, kodon adı verilen üç baz çiftinin örtüşmeyen parçalarına ayrılır. Süreç başlar başlama kodonu , AUGbir de, ve uçları durdurma kodonu , biri UAA, UAGya da UGA. Her kodon (durdurma kodonları hariç) bir amino aside karşılık gelir ve ortaya çıkan amino asit dizisi proteini oluşturur.

Giriş

Girişiniz boş olmayan bir RNA dizisidir.

Çıktı

Çıktınız, herhangi bir makul formatta RNA'nın bölündüğü kodonların listesidir. Bu basitleştirilmiş modelde, işlem çıktıya dahil edilen en sol başlangıç ​​kodonunda başlar AUG. Bir durdurma kodonu ile karşılaşıldığında veya RNA bittiğinde sona erer. Girişte başlangıç ​​kodonu yoksa çıkış boş bir liste olmalıdır.

Örnekler

Giriş sırasını göz önünde bulundurun

ACAUGGAUGGACUGUAACCCCAUGC

Ayrıştırma AUG, dizin 2'de en soldaki olayda başlar. Aşağıdaki gibi devam eder:

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

İle işaretlenmiş kodon *başlangıç ​​kodonudur ve ile işaretlenmiş olanlar ^da çıktının bir parçasıdır. Durdurma kodonu ile işaretlenmiştir +. Doğru çıktı

AUG,GAU,GGA,CUG

Daha kısa giriş için

ACAUGGAUGGACUGU

süreç devam ediyor

AC AUG GAU GGA CUG U
   *   ^   ^   ^

Bu kez bir durdurma kodonu ile karşılaşılmaz, bu nedenle taban çiftleri bittiğinde süreç durur. Çıktı yukarıdaki ile aynıdır.

Kurallar ve puanlama

Bir fonksiyonun tam programını yazabilirsiniz. En düşük bayt sayısı kazanır ve standart boşluklara izin verilmez.

Test senaryoları

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
DNA'nın RNA ile protein arasındaki ilişkisi bir zamanlar bana anlayabildiğim hesaplama terimleriyle açıklandı: DNA bir sabit diskteki bir programa eşittir; RNA hafızaya yüklenen programa eşittir; ve protein, bu programın çalışması sonucunda üretilen çıktı verilerine eşittir.
Dijital Travma

4
Moleküler biyolojinin Dogması "DNA RNA protein yapar" dır. Dolayısıyla DNA oldukça nadirdir ve RNA daha az ünlüdür, ancak çok daha yaygındır. Protein en yaygın olanıdır.
Level River St

1
@DigitalTrauma: Bir genetik uzmanı olarak, bu benzetmenin DNA'nın nasıl çalıştığı gerçeğini açıklamak için ne yazık ki yetersiz olduğuna dikkat çekmeliyim. DNA, RNA'ya kopyalanmasını bekleyen ölü bir şey değildir, bu yüzden bir şeyler yapabilir.
Jack Aidley

Bir mRNA parçası bir durdurma kodonundan önce (basit örnekte olduğu gibi) sona ererse pratikte ne olur, yani bir bırakma faktörünün bağlanması için durdurma üçlüsü yoktur?
Monica'yı eski durumuna getir - ζ--

1
@Jack sabit disk içeriği de mutlaka ölü şeyler değildir - yükseltmeler, otomatik güncellemeler, vb. Tabii ki DNA'yı anladığım kadarıyla kendi kendini iyileştirmez. Ama haklısın - Bu zayıf bir benzetme. Ancak genetikçi olmayan kendimi meslekten olmayan bir anlayışa biraz daha yaklaştırdığını düşünüyorum
Digital Trauma

Yanıtlar:


9

Retina , 39 38 32 30 bayt

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

Sondaki satır besleme önemlidir.

Satır besleme ile ayrılmış bir liste olarak çıktı.

Çevrimiçi deneyin.

açıklama

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

Bu, girdiyi tüm eşleşmelerin satır besleme ile ayrılmış bir listesine dönüştüren eşleşme aşamasıdır (nedeniyle !). Normal ifadenin kendisi, ilkinden başlayarak her kodonla eşleşir AUG. Bunu iki ayrı seçenekle başarıyoruz. AUGkoşulsuz olarak eşleşir, böylece eşleşme listesini başlatabilir. İkinci maç herhangi bir kodon olabilir ( ...herhangi bir üç karakterle eşleşir), ancak bunun \Gsadece başka bir maçtan hemen sonra eşleşmesini sağlayan özel bir çapadır. Tek sorun, \Gdizenin başında da istemediğimiz eşleşmelerdir. Giriş yalnızca kelime karakterlerinden oluştuğu için \B, girişin başında bu eşleşmenin kullanılmamasını sağlamak için (sözcük sınırı olmayan herhangi bir konum) kullanırız.

U(AA|AG|GA)\D*

Bu, ilk durdurma kodonunu U(AA|AG|GA)ve aynı zamanda her şeyi eşleştirir ve dizeden kaldırır. İlk aşama kodonları ayrı hatlara böldüğünden, bu eşleşmenin başlangıç ​​kodonu ile düzgün bir şekilde hizalandığını biliyoruz. \DHerhangi bir karakteri eşleştirmek için (rakam olmayan) kullanırız, çünkü .satır beslemelerini geçmeyecek ve giriş rakam içermeyecektir.


5

Haskell, 115112 bayt

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

Kullanım örneği:

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

Nasıl çalışır:

                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 karakter

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

Kullanım Örneği:

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

Bu durdurma kodonu olmadan giriş için başarısız olmaz mı?
Flambino

1
Haklısın, bunun bir seçenek olduğunu görmedim, düzeltmek
Benjamin Gruenbaum

Deneyin s=>/AUG(...)+?(?=(U(AA|AG|GA)|$))/.exec(s)[0].match(/.../g).
Mama Fun Roll

Hala dur kodonları için başarısız. (Test örneği 3'ü deneyin)
user81655

1

Python 2, 185 bayt

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)

Açıklamai Giriş olarak ayarlayın . 'AUG'dan sonuna kadar ayırın. Üç dizeye bölün. Kodonun durduğunu kontrol edin ve kesin.

Burada deneyin


1

MATL , 57 bayt

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

Bu , dilin / derleyicinin geçerli sürümünü (9.3.1) kullanır .

Giriş ve çıkış stdin ve stdout üzerinden yapılır. Çıktı, çizgi kesmelerle ayrılır.

Misal

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

EDIT (12 Haziran 2016): dildeki değişikliklere uyum sağlamak []için kaldırılmalıdır. Aşağıdaki bağlantı bu değişikliği içerir

Çevrimiçi deneyin!

açıklama

Kod normal ifadeye dayanır

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

Altdizgelerin başlayarak Bu stoktaki AUGüç karakter grup içeren (, ...) ve ya biten UAA, UAGveya UGA; veya dizenin sonunda sona erer ve bu durumda son bir tamamlanmamış grup ( .?.?$) olabilir. Lookahead ( (?=...)), stop kodonlarının eşleşmenin bir parçası olmaması için kullanılır. Varsa, bulunan ilk durdurma kodonunda bitirmek için eşleştirme tembeldir ( *?).

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

Yakut, 97 95 78 75 62 bayt

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

Ben çok golf yok, bu yüzden geliştirilebilir eminim.

Düzenleme: çaldı Martin BÜTTNER mükemmel Ödünç \B\Ghile

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.