RNA , podobnie jak DNA, jest cząsteczką występującą w komórkach kodujących informację genetyczną. Składa się z nukleotydów , które są reprezentowane przez zasady adeniny (A), cytozyny (C), guaniny (G) i uracylu (U). * Kodon to sekwencja trzech nukleotydów.
Białka to duże cząsteczki, które spełniają szeroki wachlarz funkcji, takich jak keratyna występująca we włosach i paznokciach oraz hemoglobina przenosząca tlen w komórkach krwi. Składają się z aminokwasów , które są kodowane jako kodony w cząsteczkach RNA. Czasami różne kodony mogą kodować ten sam aminokwas. Każdy aminokwas jest zwykle reprezentowany przez jedną literę, na przykład H oznacza histydynę.
Biorąc pod uwagę sekwencję ACGU
, czy możesz przetłumaczyć go na odpowiedni ciąg białka?
* DNA składa się z ACGT, gdzie T oznacza tyminę. Podczas transkrypcji DNA na RNA tyminę zastępuje się uracylem.
Wejście
Dane wejściowe będą pojedynczym ciągiem znaków składającym się wyłącznie z ACGU
wielkich liter. Możesz napisać funkcję lub pełny program dla tego wyzwania.
Wynik
Możesz wybrać wyjście poprzez wydrukowanie lub zwrócenie ciągu (ten ostatni wybór jest dostępny tylko w przypadku funkcji).
Tłumaczenie powinno rozpoczynać się od kodonu startu ( AUG
, reprezentowane M
) i na końcu w kodon stop (jeden UAA
, UAG
lub UGA
, reprezentowane *
). Istnieją cztery przypadki, w których dane wejściowe mogą być nieprawidłowe:
- Wejście nie zaczyna się od kodonu start
- Wejście nie kończy się kodonem stop
- Długość wejścia nie jest wielokrotnością 3
- Dane wejściowe zawierają kodon stop w innym miejscu niż na końcu
We wszystkich tych przypadkach Error
powinny być generowane. Zauważ, że w przeciwieństwie do kodonów stop, kodony start mogą pojawić się po rozpoczęciu łańcucha.
W przeciwnym razie należy przekonwertować każdy kodon na odpowiedni aminokwas za pomocą następującej tabeli kodonów RNA :
* UAA UAG UGA
A GCU GCC GCA GCG
C UGU UGC
D GAU GAC
E GAA GAG
F UUU UUC
G GGU GGC GGA GGG
H CAU CAC
I AUU AUC AUA
K AAA AAG
L UUA UUG CUU CUC CUA CUG
M AUG
N AAU AAC
P CCU CCC CCA CCG
Q CAA CAG
R CGU CGC CGA CGG AGA AGG
S UCU UCC UCA UCG AGU AGC
T ACU ACC ACA ACG
V GUU GUC GUA GUG
W UGG
Y UAU UAC
... i wyślij przetłumaczony ciąg.
Przykłady
Nieprawidłowe przypadki:
<empty string> -> Error
AUG -> Error
UAA -> Error
AUGCUAG -> Error
AAAAAAA -> Error
GGGCACUAG -> Error
AUGAACGGA -> Error
AUGUAGUGA -> Error
AUGUUUGUUCCGUCGAAAUACCUAUGAACACGCUAA -> Error
Ważne przypadki:
AUGUGA -> M*
AUGAGGUGUAGCUGA -> MRCS*
AUGGGUGAGAAUGAAACGAUUUGCAGUUAA -> MGENETICS*
AUGCCAGUCGCACGAUUAGUUCACACGCUCUUGUAA -> MPVARLVHTLL*
AUGCUGCGGUCCUCGCAUCUAGCGUUGUGGUUAGGGUGUGUAACUUCGAGAACAGUGAGUCCCGUACCAGGUAGCAUAAUGCGAGCAAUGUCGUACGAUUCAUAG -> MLRSSHLALWLGCVTSRTVSPVPGSIMRAMSYDS*
AUGAAAAACAAGAAUACAACCACGACUAGAAGCAGGAGUAUAAUCAUGAUUCAACACCAGCAUCCACCCCCGCCUCGACGCCGGCGUCUACUCCUGCUUGAAGACGAGGAUGCAGCCGCGGCUGGAGGCGGGGGUGUAGUCGUGGUUUACUAUUCAUCCUCGUCUUGCUGGUGUUUAUUCUUGUUUUAA -> MKNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVVYYSSSSCWCLFLF*
Edycja: Dodano więcej przypadków testowych
Punktacja
To jest kod golfowy, więc kod w najmniejszej liczbie bajtów wygrywa.
Uwaga: nie jestem ekspertem w dziedzinie biologii molekularnej, więc możesz mnie poprawić, jeśli coś źle przedstawiłem :)
źródło
M
i kończy dekodowana sekwencja*
.Odpowiedzi:
CJam (
97 93 9291 bajtów)Jest to część mojego rozwiązania GolfScript z nieco poprawioną funkcją skrótu, ponieważ ku mojemu zdziwieniu jedną rzeczą, której CJam nie pożyczył od GolfScript, traktuje łańcuchy znaków jako tablice liczb całkowitych.
6 bajtów zapisanych dzięki sugestiom Optimizera (w tym dwa bajty z czegoś, co myślałem, że próbowałem i nie działało - huh).
źródło
q"GACU"f#3/{4b"GGEDAAVVRSKNTTMIRRQHPPLLWC*YSSLF"{_s"MW""I*"er}%=}%s_'*/(1<"M"=*Q="Error"@?
- 90Q
raczej niż[Q]
jest po prostu niepoprawne.[Q]
doQ
zmiany jest prawidłowe.AUGUAGUGA
[Q]
->Qa
JavaScript (ES6) 167
177znaków zakodowanych w UTF8 jako 167177bajtów... więc mam nadzieję, że wszyscy są szczęśliwi.
Edytuj W rzeczywistości nie ma potrzeby specjalnego przypadku dla ostatniego bloku za krótko. Jeśli ostatnie 2 (lub 1) znaki nie są zamapowane, łańcuch wynikowy nie kończy się na „*”, co i tak daje błąd.
Wyjaśniono
Każdy znak w triplecie może mieć 4 wartości, więc są dokładnie 4 ^ 3 == 64 trojaczki. Funkcja C odwzorowuje każdą trojkę na liczbę od 0 do 63. Nie trzeba sprawdzać błędów, ponieważ znaki wejściowe to tylko ACGU.
Każda trójka mapuje się do aminokwasu zidentyfikowanego przez pojedynczy znak. Możemy zakodować to w ciągu 64 znaków. Aby uzyskać ciąg, zacznij od mapy kodonów:
... uzyskanie „KNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVV * Y * YSSSS * CWCLFLF”
Możemy więc zeskanować ciąg wejściowy i użyć tej samej logiki funkcji C, aby uzyskać kod 0..63, a z kodu kod aminokwasowy. Funkcja zamiany podzieli łańcuch wejściowy na 3 bloki znaków, ostatecznie pozostawiając 1 lub 2 znaki niezarządzane (co da niepoprawny ciąg wyników, nie kończący się na „*”).
Na koniec sprawdź, czy zakodowany ciąg jest prawidłowy, używając wyrażenia regularnego: musi zaczynać się od „M”, nie może zawierać „*” i musi kończyć się na „*”
Testuj w konsoli FireBug / FireFox
Wynik
źródło
C, 190 bajtów (funkcja)
199194 bajtów (program)Zaoszczędzono kilka bajtów, poprawiając formułę mieszania.
Oto zabawny przypadek testowy:
Wyjaśnienie
Trójka liter jest konwertowana na podstawową liczbę 4. Każda litera jest mieszana w następujący sposób.
Daje to liczbę z zakresu
0..63
. Chodzi teraz o użycie tabeli odnośników podobnej do tabeli używanej przez edc65 i Optimizer. Jednak skrót jest tak zaprojektowany, że G i A znajdują się obok siebie, a U i C są obok siebie.Patrząc na stół na https://en.wikipedia.org/wiki/Genetic_code#RNA_codon_table , widzimy, że przy literach uporządkowanych w ten sposób, na ogół ostatni bit można zignorować. Potrzebna jest tylko 32-znakowa tabela odnośników, z wyjątkiem dwóch specjalnych przypadków.
Zobacz poniżej dwie pierwsze litery i odpowiadające im aminokwasy (gdzie trzecia litera to G / A, a trzecia litera to U / C). Korekty dla dwóch specjalnych przypadków, które nie pasują do 32-znakowej tabeli, są zakodowane na stałe.
Skomentowany kod
W wersji golfowej
i%3
kod znajduje się w pozycji przyrostowejfor
nawiasu, ale jest przenoszony do bardziej czytelnej pozycji w skomentowanym kodzie.źródło
O
! Dodałem jednak przypadek testowyMGENETICS*
, ponieważ jest to najbardziej tematyczne słowo, jakie mogęCJam,
317 121104 bajtówMożna to jeszcze pograć w golfa.
Zaktualizowano mechanizm mapowania do tego zastosowanego w odpowiedzi edc65. Mimo że sam to wymyśliłem, pobił mnie do tego :)
AKTUALIZACJA : Skrócono mapę tabeli kodonów, obserwując w niej wzorzec.
Wypróbuj online tutaj
źródło
GolfScript (103 bajty)
Demo online (NB nie obejmuje dwóch największych przypadków testowych, ponieważ musi zostać uruchomiony w 15 sekund).
Sekcja
Jak zauważył Steve Verrill w piaskownicy, tabelę wyszukiwania można zredukować do 32 elementów plus dwa specjalne przypadki. Okazuje się, że przypadki szczególne dotyczą zarówno znaków (
M
iW
odpowiednio), które występują tylko raz, a przy odpowiednim odwzorowaniu znaków na 4 cyfry możliwe jest zbudowanie pełnej 64-elementowej tabeli odnośników z 32 elementów poprzez wykonanie duplikatu itr
:Po zakończeniu dekodowania weryfikacja pozwala na wiele podejść. Najkrótszy, jaki znalazłem, to
źródło
M
był to jeden ze specjalnych przypadków, w celu przetestowania prawidłowego startu, ale tak się nie udało. Ciąg zawiera jeszcze 8 par identycznych liter. Zastanawiam się, czy można je skompresować małymi literami:g-->GG
a-->AA
itp. Jeśli dekompresję można uzyskać przy użyciu mniej niż 8 znaków, warto.Python, 473 bajty
źródło
Python 2,
370358354 bajtówJest to bardzo proste podejście bez kompresji, po prostu próbujące spakować informacje dość gęsto:
Edycja: Ogoliłem kilka znaków zgodnie z sugestią Xnora.
źródło
s
rekurencyjnie pisać krótsze jakos=lambda x:x and[x[:3]]+s(x[3:])
.Scala (317 znaków)
Główną funkcją jest
f
. Oczywiście lepszym wyborem byłby zwrotOption[String]
.źródło
JavaScript (ES6), 143 bajty
Wypróbuj online!
źródło