Wprowadzenie
RNA jest mniej znanym kuzynem DNA. Jego głównym celem jest kontrola produkcji białek w komórkach poprzez proces zwany translacją . W tym wyzwaniu Twoim zadaniem jest wdrożenie części tego procesu, w której RNA jest dzielony na kodony .
To wyzwanie jest powiązane tematycznie, ale koncentruje się na innej części procesu tłumaczenia.
Codons
Będziemy myśleć RNA jako długi ciąg nad alfabetem par bazowych AUCG
. W tłumaczeniu RNA dzieli się na niepochodzące na siebie fragmenty trzech par zasad, zwane kodonami. Proces rozpoczyna się w kodonie startowym , AUG
i kończy się kodonem stop , jednego UAA
, UAG
albo UGA
. Każdy kodon (oprócz kodonów stop) odpowiada aminokwasowi, a powstały ciąg aminokwasów tworzy białko.
Wejście
Twoje dane wejściowe to niepusty ciąg RNA.
Wynik
Twój wynik to lista kodonów, w których RNA jest podzielony, w dowolnym rozsądnym formacie. W tym uproszczonym modelu proces rozpoczyna się od lewego kodonu start AUG
, który jest zawarty w wyjściu. Kończy się, gdy napotkamy kodon stop lub skończy nam się RNA. Jeśli dane wejściowe nie zawierają kodonu początkowego, dane wyjściowe powinny być pustą listą.
Przykłady
Rozważ sekwencję wejściową
ACAUGGAUGGACUGUAACCCCAUGC
Analiza rozpoczyna się przy wystąpieniu skrajnie po lewej stronie AUG
indeksu 2. Kontynuuje się w następujący sposób:
AC AUG GAU GGA CUG UAA CCCCAUGC
* ^ ^ ^ +
Kodon oznaczony *
jest kodonem start, a te oznaczone jako ^
są również częścią wyniku. Kodon stop jest oznaczony +
. Prawidłowe wyjście to
AUG,GAU,GGA,CUG
Dla krótszych danych wejściowych
ACAUGGAUGGACUGU
proces idzie
AC AUG GAU GGA CUG U
* ^ ^ ^
Tym razem kodon stop nie został napotkany, więc proces zatrzymuje się, gdy zabraknie par zasad. Dane wyjściowe są takie same jak powyżej.
Zasady i punktacja
Możesz napisać pełny program funkcji. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.
Przypadki testowe
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
Odpowiedzi:
Retina ,
39383230 bajtówKońcowe podawanie linii jest znaczące.
Dane wyjściowe w postaci listy oddzielonej od linii.
Wypróbuj online.
Wyjaśnienie
Jest to etap dopasowania, który przekształca dane wejściowe w listę wszystkich dopasowań oddzieloną od linii (z powodu
!
). Sam regex pasuje do każdego kodonu, zaczynając od pierwszegoAUG
. Osiągamy to dzięki dwóm oddzielnym opcjom.AUG
dopasowuje bezwarunkowo, aby mógł rozpocząć listę dopasowań. Drugim dopasowaniem może być dowolny kodon (...
pasuje do dowolnych trzech znaków), ale\G
jest to specjalna kotwica, która zapewnia, że może się dopasować dopiero po kolejnym dopasowaniu. Jedynym problemem jest to, że\G
pasuje również na początku łańcucha, czego nie chcemy. Ponieważ dane wejściowe składają się wyłącznie ze znaków słownych, używamy\B
(dowolnej pozycji, która nie jest granicą słowa), aby upewnić się, że to dopasowanie nie będzie używane na początku wprowadzania.Znajduje pierwszy kodon stop, dopasowany, a
U(AA|AG|GA)
także wszystko po nim i usuwa go z łańcucha. Ponieważ pierwszy etap dzieli kodony na osobne linie, wiemy, że to dopasowanie jest odpowiednio wyrównane z kodonem start. Używamy\D
(nie cyfr), aby dopasować dowolny znak, ponieważ.
nie przekroczyłby linii, a dane wejściowe nie będą zawierać cyfr.źródło
Haskell,
115112 bajtówPrzykład użycia:
Jak to działa:
źródło
JavaScript
88827069 znakówPrzykład użycia:
źródło
s=>/AUG(...)+?(?=(U(AA|AG|GA)|$))/.exec(s)[0].match(/.../g)
.Python 2, 185 bajtów
Objaśnienie Ustaw
i
na wejście. Podziel go od „AUG” do końca. Podzielony na trzy ciągi. Sprawdź, czy kodon stop i wytnij.Wypróbuj tutaj
źródło
MATL , 57 bajtów
To używa bieżącej wersji (9.3.1) języka / kompilatora.
Wejście i wyjście odbywa się poprzez standardowe wejście i standardowe wyjście. Dane wyjściowe są oddzielone podziałem wiersza.
Przykład
EDYCJA (12 czerwca 2016 r.): Aby dostosować się do zmian w języku,
[]
należy go usunąć. Poniższy link zawiera tę modyfikacjęWypróbuj online!
Wyjaśnienie
Kod oparty jest na wyrażeniu regularnym
Dopasowuje podciągi, począwszy od dnia
AUG
, zawierające grupy trzech znaków (...
), a kończąc na jedenUAA
,UAG
lubUGA
; lub kończące się na końcu ciągu, w tym przypadku może być jeszcze jedna niekompletna grupa (.?.?$
). Funkcja Lookahead ((?=...)
) jest używana, aby kodony stop nie były częścią dopasowania. Dopasowanie jest lazy (*?
), aby zakończyć na pierwszym znalezionym kodonie stop, jeśli taki istnieje.źródło
Ruby,
9795787562 bajtówNie gram dużo w golfa, więc jestem pewien, że można to poprawić.
Edycja:
Stolepożyczył doskonałą\B\G
sztuczkę Martina Büttneraźródło