Jak zapewne wiesz, w DNA są cztery zasady - adenina ( A
), cytozyna ( C
), guanina ( G
) i tymina ( T
). Zwykle A
wiązania z T
i C
wiązania z G
tworzącą „szczeble” z podwójną spiralą DNA .
Definiujemy dopełnienie zasady jako bazę, z którą się wiąże - tj. Dopełnienie A
jest T
, dopełnienie T
jest A
, uzupełnienie C
jest G
i uzupełnienie G
jest C
. Możemy również zdefiniować dopełnienie łańcucha DNA jako ciąg z każdą komplementowaną zasadą, np. Dopełnienie GATATC
to CTATAG
.
Ze względu na dwuniciową strukturę DNA zasady jednej nici są komplementarne do zasad drugiej nici. Jednak DNA ma kierunek, a transkrypcja DNA zachodzi w przeciwnych kierunkach na dwóch niciach. Dlatego biolodzy molekularni są często zainteresowani odwrotnym dopełnieniem łańcucha DNA - całkiem dosłownie odwrotnością dopełniacza łańcucha.
Aby rozszerzyć nasz poprzedni przykład, odwrotne uzupełnienie GATATC
jest odwrotne CTATAG
, więc GATATC
. Jak można zauważyć, w tym przykładzie odwrotne uzupełnienie jest równe pierwotnemu ciągowi - taki ciąg nazywamy odwrotnym palindromem . *
Biorąc pod uwagę ciąg DNA, czy możesz znaleźć najdłuższy substrat, którym jest odwrotny palindrom?
* Używam terminu „odwrotny palindrom” zaczerpnięty z Rosalind , aby odróżnić się od zwykłego znaczenia palindromu.
Wejście
Dane wejściowe będą stanowić pojedynczy ciąg znaków składający się wyłącznie ze znaków ACGT
pisanych wielkimi literami. Możesz napisać funkcję lub pełny program dla tego wyzwania.
Wynik
Możesz zdecydować się na wydruk za pośrednictwem drukowania lub zwrotu (ten drugi wybór jest dostępny tylko w przypadku funkcji).
Twój program powinien wypisać najdłuższy odwrotny palindromiczny podciąg ciągu wejściowego, jeśli istnieje unikalne rozwiązanie. Jeśli istnieje wiele rozwiązań, możesz wydrukować dowolne z nich lub wszystkie (według własnego wyboru). Duplikaty są w porządku, jeśli zdecydujesz się wydrukować je wszystkie.
Gwarantowane wejście ma rozwiązanie o długości co najmniej 2.
Przykład działał
ATGGATCCG -> GGATCC
Odwrotnym dopełnieniem GGATCC
jest samo ( GGATCC --complement--> CCTAGG --reverse--> GGATCC
), podobnie GGATCC
jak odwrotny palindrom. GATC
jest także odwrotnym palindomem, ale nie jest najdłuższy.
Przypadki testowe
AT -> AT
CGT -> CG
AGCA -> GC
GATTACA -> AT, TA
ATGGATCCG -> GGATCC
CCCCCGGGGG -> CCCCCGGGGG
ACATATATAGACT -> ATATAT, TATATA
ATTCGATCTATGTAAAGAGG -> TCGA, GATC
CGCACGTCTACGTACCTACGTAG -> CTACGTAG
TCAATGCATGCGGGTCTATATGCAT -> ATGCAT, GCATGC [, ATGCAT]
CGCTGAACTTTGCCCGTTGGTAGAACGGACTGATGTGAACGAGTGACCCG -> CG, GC, TA, AT [, GC, CG, CG, CG, CG]
CTCGCGTTTGCATAACCGTACGGGCGGAACAGTCGGCGGTGCCTCCCAGG -> CCGTACGG
Punktacja
To jest kod golfowy, więc wygrywa rozwiązanie w najmniejszej liczbie bajtów.
źródło
Odpowiedzi:
Pyth,
37 36 2824 bajtówJest to bardzo krótka wersja, łącząca wskazówki od FryAmTheEggman i lewą sztuczkę sprawdzania palindromu od Petera.
Działa to jednak tylko z Pyth 3.0.1, który można pobrać z tego linku i działać jak
(tylko linux bash. W systemie Windows naciśnij Enter zamiast <<<, a następnie wpisz dane wejściowe)
To jest moje poprzednie zgłoszenie - rozwiązanie 28 bajtów
Dzięki FryAmTheEggman dla tej wersji. Ten tworzy wszystkie możliwe podzbiory wejściowego łańcucha DNA, filtruje podzbiory pod warunkiem, że podzbiór jest podciągiem wejściowym, a odwrotność transformacji jest równa samemu podzestawowi.
Ze względu na wszelkie możliwe tworzenie podzbiorów zajmuje to więcej pamięci niż odpowiedź Piotra.
To moje pierwsze przesłanie - rozwiązanie 36-bajtowe.
To jest dokładne tłumaczenie mojej odpowiedzi CJam . Miałem nadzieję, że będzie on znacznie mniejszy, ale okazuje się, że brak metody tłumaczenia spowodował, że był prawie podobny rozmiar (wciąż 2 bajty mniejsze)
Wypróbuj online tutaj
źródło
Uz
jest równoważne zUlz
.J"ACGT"eolNf&}TzqTjk_m@_JxJdTyz
Korzystaniey
z podzbiorów, a następnie filtrowanie ciągów, które nie sąz
y
jest już posortowane według długości. Możesz po prostu zrobićef...
GolfScript (
3534 bajtów)Do celów testowych możesz użyć
co dodaje a,
.&
aby zmniejszyć powielony wysiłek.Sekcja
źródło
q{]{__(;\);}%~}h]{:c:i6f&_4f^W%=}=
w CJam. Ten sam rozmiar. Nie próbuj tego w internetowym kompilatorze dla niczego większego niż 7 długości wejściowychCJam,
3938 bajtówJestem pewien, że można to jeszcze pograć w golfa ...
Pobiera łańcuch DNA ze STDIN i wysyła najdłuższy odwrotny palindromowy DNA do STDOUT
Wypróbuj online tutaj
(Wyjaśnienie wkrótce) (Zapisano 1 bajt dzięki Peterowi)
źródło
Python 3, 125 znaków
Spójrz, nie ma indeksowania! (Cóż, z wyjątkiem odwrócenia łańcucha, to się nie liczy).
Iterowanie po podciągach odbywa się poprzez zdjęcie znaków z przodu i końca przy użyciu przypisania oznaczonego gwiazdką . Zewnętrzna pętla usuwa znaki na początku
S
i dla każdego takiego sufiksus
zapętla wszystkie jego przedrostki, testując je jeden po drugim.Testowanie odwrotnego palindromu odbywa się za pomocą kodu
który sprawdza, czy każdy symbol i jego odpowiednik o odwróconym łańcuchu to jeden z „AT”, „TA”, „CG” i „GC”. Znalazłem również rozwiązanie oparte na zestawie, które jest o jedną postać krótsze, ale traci dwa znaki, gdy wymaga użycia zewnętrznych parens.
Nadal wydaje się, że można go skrócić.
Wreszcie drukowany jest najdłuższy palindrom.
Mam nadzieję, że wyjścia rozdzielone spacjami są OK. Jeśli lista również jest w porządku, gwiazda może zostać usunięta. Zamiast tego próbowałem śledzić biegnące maksimum w pętli, a także wcisnąć wewnętrzne pętle w zrozumienie listy, aby móc wziąć maksimum bezpośrednio bez konstruowania
l
, i oba okazały się nieco dłuższe. Ale było na tyle blisko, że trudno powiedzieć, które podejście jest rzeczywiście najlepsze.źródło
J (45)
Ta funkcja pobiera ciąg znaków:
Wyjaśnienie:
źródło
Perl - 59 bajtów
Licząc shebang jako jeden, dane pochodzą z
STDIN
.Przykładowe użycie:
źródło
Python 2 - 177 bajtów
Prosta brutalna siła. Faktyczna kontrola „odwrotnej palindromiki” jest jedyną interesującą częścią. Tutaj jest napisane bardziej czytelnie:
Robię to na każdym możliwym podciągu i umieszczam je na liście, jeśli to prawda. Jeśli to fałsz, zamiast tego wstawiam pusty ciąg. Po zakończeniu wszystkich sprawdzeń wypisuję najdłuższy element listy. Użyłem pustego ciągu, ponieważ oszczędza on bajtów przed wstawieniem niczego, ale oznacza również, że program nie będzie się dusił, jeśli nie będzie rozwiązania. Wysyła pustą linię i wychodzi z wdziękiem.
źródło
s=raw_input();r,l,g=range,len(s),'TGCA';print max([a for a in[s[i:j+1]for i in r(l)for j in r(i,l)]if[g[n]for n in[~g.find(c)for c in a]]==list(a)[::-1]],key=len)
. Również na smyczki, należy użyćfind
w ciąguindex
:)