Problem
Utwórz funkcję, która może określić, czy dowolny łańcuch DNA jest palindromem Watsona-Cricka. Funkcja pobierze ciąg DNA i wyświetli wartość prawdziwą, jeśli jest to palindrom Watsona-Cricka, a wartość fałszywą, jeśli nie jest. (Prawda i fałsz mogą być reprezentowane odpowiednio jako 1 i 0).
Łańcuch DNA może być pisany wielkimi lub małymi literami, w zależności od preferencji.
Również łańcuch DNA nie będzie pusty.
Wyjaśnienie
Łańcuch DNA jest palindromem Watsona-Cricka, gdy dopełnienie jego rewersu jest sobie równe.
Biorąc pod uwagę ciąg DNA, najpierw odwróć go, a następnie uzupełnij każdy znak zgodnie z zasadami DNA (A ↔ T i C ↔ G). Jeśli oryginalny ciąg znaków jest równy ciągowi uzupełnionego-odwrotnego, jest to palindrom Watsona-Cricka.
Aby uzyskać więcej informacji, zobacz to pytanie . Jest to inne wyzwanie, w którym musisz znaleźć najdłuższy podciąg łańcucha DNA, w którym podciąg ten jest palindromem Watsona-Cricka.
Cel
To jest gra w golfa i wygrywa najkrótszy kod.
Przypadki testowe
Format to <input> = <output>
.
ATCGCGAT = true
AGT = false
GTGACGTCAC = true
GCAGTGA = false
GCGC = true
AACTGCGTTTAC = false
ACTG = false
Odpowiedzi:
05AB1E ,
107 bajtówKod:
Wyjaśnienie:
Aby sprawdzić, czy ciąg znaków jest palindromem, musimy tylko sprawdzić dane wejściowe za pomocą danych wejściowych, z
at
zamianą icg
zamianą, a następnie odwrócić. Tak właśnie zamierzamy zrobić. Naciskamy wejście, a wejście odwracamy za pomocąÂ
(bifurcate). Teraz przychodzi trudna część.'š×
jest wersją skompresowaną dlacreating
. Jeśli to odwrócimy, zobaczysz, dlaczego znajduje się w kodzie:Będzie to wykorzystane do transliteracji odwróconego wejścia. Transliteracja odbywa się za pomocą
‡
. Następnie sprawdzamy tylko, czy dane wejściowe i dane transliterowane są prawidłowe,Q
i wypisujemy tę wartość. Tak wygląda stos dla danych wejściowychactg
:Co można również zobaczyć z flagą debugowania ( wypróbuj tutaj ).
Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .
źródło
Galaretka , 9 bajtów
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
lambda s:
. To prawie pełne rozwiązanie!Python 2,
564544 bajtówźródło
lambda s:s==s[::-1].translate("TCG_A"*99)
działa w Pythonie 3Perl, 27 bajtów
Obejmuje +2 za
-lp
Podaj dane na STDIN, drukuje 1 lub nic:
dnapalin.pl
:Zamień
$_=
na,$_+=
aby otrzymać0
zamiast pustego dla fałszywej sprawyźródło
Pyth - 10 bajtów
Wypróbuj online tutaj .
Będzie to 9 bajtów po usunięciu błędu, który powoduje, że nie konkuruje: Wypróbuj tutaj online .
źródło
Siatkówka ,
3433 bajtyWypróbuj online! (Nieznacznie zmodyfikowany, aby uruchomić wszystkie przypadki testowe jednocześnie).
Wyjaśnienie
Zduplikuj dane wejściowe, dopasowując koniec łańcucha i wstawiając
;
następnie całe dane wejściowe.Dopasuj tylko drugą połowę danych wejściowych
;.+
i dokonaj podstawienia par transliteracją. Jeśli chodzi o zestaw docelowyRo
:o
odwołuje się do drugiego zestawu, któryo
jest zastępowany przezACGT
. AleR
odwraca ten zestaw, więc dwa zestawy są w rzeczywistości:Jeśli dane wejściowe to palindrom DNA, będziemy mieli dane wejściowe, a następnie ich odwrotność (oddzielone przez
;
).Wielokrotnie (
+
) usuń parę identycznych znaków wokół;
. To będzie trwać, dopóki nie pozostaną tylko;
znaki, lub dopóki dwa znaki wokół;
nie będą już identyczne, co oznacza, że ciągi znaków nie są odwrotnością.Sprawdź, czy pierwszym znakiem jest
;
i wydrukuj0
lub1
odpowiednio.źródło
JavaScript (ES6), 59 bajtów
Najlepsze, co mogłem zrobić bez użycia Regexp, to 62 bajty:
źródło
Ruby, 35 lat
Próbowałem na inne sposoby, ale oczywisty był najkrótszy:
w programie testowym
źródło
->s{s.==s.reverse.tr'ACGT','TGCA'}
jest bajt krótszy.
. Bez niego kod wydaje mi się bardziej odpowiedni, ale jest wymagany, aby go uruchomić. Czy jest to gdziekolwiek udokumentowane?==
jako metody, a nie operatora, ale wyszukiwanie za pomocą symboli jest niemożliwe.Haskell,
4845 bajtówPrzykład użycia:
(==)=<<reverse.map((cycle"_T_GA__C"!!).fromEnum) $ "ATCGCGAT"
->True
.Wersja nie-punktowa to
Edycja: @Mathias Dolidon zapisał 3 bajty. Dzięki!
źródło
cycle "TCG_A"
również z . :)Siatkówka, 52 bajty
źródło
Julia,
4738 bajtówJest to anonimowa funkcja, która przyjmuje
Char
tablicę i zwraca wartość logiczną. Aby go wywołać, przypisz go do zmiennej.Wykorzystuje algorytm Dennisa, który jest krótszy niż naiwne rozwiązanie. Otrzymujemy resztę każdego punktu kodowego podzieloną przez 8, dodajemy to do siebie odwróconą, pobieramy resztę z dzielenia przez 5 i sprawdzamy, czy wszystkie mają wartość 0. Ostatni krok jest wykonywany przy użyciu
⊆
wersji infiksowejissubset
, która rzuca oba argumenty naSet
przed sprawdzeniem. Oznacza to, że[0,0,0]
jest zadeklarowany jako podzbiór0
, ponieważSet([0,0,0]) == Set(0)
. Jest to krótsze niż jawne sprawdzenie z 0.Wypróbuj online!
Zaoszczędź 9 bajtów dzięki Dennisowi!
źródło
Jolf, 15 bajtów
Spróbuj!
Wyjaśnienie:
źródło
Jolf, 16 bajtów
Wypróbuj tutaj!
Wyjaśnienie
źródło
Właściwie 19 bajtów
Wykorzystuje algorytm Dennisa .
Wypróbuj online!
Wyjaśnienie:
źródło
Oracle SQL 11.2, 68 bajtów
źródło
Julia 0.4, 22 bajty
Ciąg zawiera znaki sterujące EOT (4) i NAK (21). Dane wejściowe muszą mieć postać tablicy znaków.
Takie podejście XORs znaków wejściowych z odpowiednimi znakami na odwrotnym wejściu. W przypadku prawidłowych par powoduje to użycie znaków EOT lub NAK. Testowanie włączenia do ciągu tych znaków daje pożądaną wartość logiczną.
Wypróbuj online!
źródło
C, 71
2 bajty zapisane przez Dennisa. Dodatkowe 2 bajty zapisane przez dostosowanie do wprowadzania małych liter: stałe
37
i21
są korygowane do5
i2
.C 75
Zapisano jeden bajt: wyeliminowano nawias, biorąc iloczyn dwóch kodów ASCII mod 37. Prawidłowe pary mają wartość 21. Przyjmuje duże litery.
C 76
Wykorzystuje fakt, że kody ASCII poprawnych par sumują się do 138 lub 149. Gdy wzięty mod 11, są to jedyne pary, które sumują się do 6. Zakłada się wprowadzanie wielkich liter.
nie wziął udziału w programie testowym
źródło
r,e;f(char*s){for(r=0,e=strlen(s)+1;*s;s++)r|=*s*s[e-=2]%37^21;return!r;}
oszczędza kilka bajtów.!=
>^
siebie. Zmniejszyłem kolejne 2, zmieniając na małe litery: obie magiczne liczby są teraz jednocyfrowe.Czynnik , 72 bajty
Niestety regex nie może mi tutaj pomóc.
Odwróć, tabela odnośników, porównaj równe.
źródło
Bash + coreutils,
4332 bajtyTesty:
źródło
J - 21 bajtów
Na podstawie metody Dennisa
Stosowanie
Wyjaśnienie
źródło
Labirynt , 42 bajty
Kończy się z błędem dzielenia przez zero (komunikat o błędzie na STDERR).
Wypróbuj online!
Układ wydaje się naprawdę nieefektywny, ale po prostu nie widzę teraz sposobu na grę w golfa.
Wyjaśnienie
To rozwiązanie opiera się na sztuczce arytmetycznej Dennisa: weź wszystkie kody znaków modulo
8
, dodaj parę z obu końców i upewnij się, że jest podzielna przez5
.Podkład labiryntowy:
Kod zaczyna się od małej pętli 2x2 zgodnej z ruchem wskazówek zegara, która odczytuje wszystkie wejściowe moduły 8:
Teraz
;
odrzuca-1
. Wchodzimy w kolejną pętlę zgodnie z ruchem wskazówek zegara, która przesuwa górę głównego stosu (tj. Ostatniego znaku) na dół:Teraz jest krótki bit liniowy:
Adres IP znajduje się teraz na skrzyżowaniu, które działa jak gałąź do testowania podzielności przez 5. Jeśli wynik modulo jest niezerowy, wiemy, że dane wejściowe nie są palindromem Watsona-Cricka i skręcamy na wschód:
W przeciwnym razie musimy nadal sprawdzać resztę danych wejściowych, aby IP kontynuowało podróż na południe. Do
{
ciągnie po dnie pozostałego wejścia. Jeśli wyczerpaliśmy wejście, to będzie to0
(od dołu Aux ), a IP kontynuuje przemieszczanie się na południe:W przeciwnym razie w ciągu będzie więcej znaków do sprawdzenia. IP skręca na zachód i przechodzi do następnej (zgodnej z ruchem wskazówek zegara) pętli 2x2, która składa się głównie z no-ops:
Po tej pętli mamy ponownie dane wejściowe na głównym stosie, z wyjątkiem pierwszego i ostatniego znaku i zera na górze. W
;
odrzuca0
, a następnie=
zamienia czubki stosów, ale to jest po prostu anulować pierwszy=
w pętli, ponieważ jesteśmy teraz wejściem do pętli w innym miejscu. Wypłukać i powtórzyć.źródło
sed,
6761 bajtów(67 bajtów)
Test
Wydajność
Używając rozszerzonych wyrażeń regularnych, liczbę bajtów można zmniejszyć do 61.
źródło
C #, 65 bajtów
.NET ma czasami dość długie nazwy metod frameworka, co niekoniecznie jest najlepszym frameworkiem do golfa. W tym przypadku nazwy metod ramowych składają się z 33 znaków na 90. :)
Na podstawie sztuczki modułowej z innego miejsca w wątku:
Teraz waży 67 znaków, z czego 13 to nazwy metod.
Kolejna drobna optymalizacja, aby zgolić potężne 2 znaki:
65 z czego 13 to nazwy ramowe.
Edycja: Pominięcie niektórych ograniczonych „szablonów” z rozwiązania i dodanie kilku warunków pozostawia nam wyraz
Co daje 0 wtedy i tylko wtedy, gdy ciąg s jest poprawną odpowiedzią. Jak wskazuje cat, „bool F (string s) =>” można w rzeczywistości zastąpić „s =>” jeśli w kodzie jest inaczej jasne, że wyrażenie jest a
Func<string,bool>
, tzn. odwzorowuje ciąg na wartość logiczną.źródło
!s.Zip...
tego zrobićs.Zip...==0
? (Czy nie możesz!
ints w C #?) Nawet jeśli nie potrafisz go zaprzeczyć boolean, możesz pominąć jakąkolwiek inwersję i stwierdzić w swojej odpowiedzi, że zwraca to <to coś> dla falsy i <inny deterministyczny, rzecz wyraźnie dostrzegalna> dla prawdy.REXX 37
źródło
R, 101 bajtów
Przypadki testowe
źródło
strsplit(x,"")[[1]]
jest o 3 bajty krótszy niżunlist(strsplit(x,""))
i tutaj jest równoważny, ponieważx
zawsze jest jednym ciągiem znaków.Oktawa, 52 bajty
Podążając za sztuczką Denisa ... weź wartości ASCII mod 8, odwróć i zsumuj; jeśli każda suma jest wielokrotnością pięciu, jesteś złoty.
źródło
f=
zadanie; funkcje bez nazw są w porządku.Clojure / ClojureScript, 49 znaków
Działa na ciągach znaków. Jeśli wymagania zostaną zmniejszone, aby umożliwić listy, mogę zdjąć
(list* )
i zapisać 7 znaków.źródło
R, 70 bajtów
Stosowanie:
źródło
C, 71 bajtów
Wymaga kodów ASCII dla odpowiednich znaków, ale akceptuje wprowadzanie wielkich, małych i małych liter.
Ten kod utrzymuje dwa wskaźniki
s
ip
przemierza łańcuch w przeciwnych kierunkach. Na każdym kroku porównujemy odpowiednie znaki, ustawiając wartośćb
true, jeśli się nie zgadzają. Dopasowanie opiera się na XOR wartości znaków:W powyższej tabeli widzimy, że chcemy odnotować sukces
xx10x
i porażkę dla czegokolwiek innego, więc XOR za pomocą00100
(czterech) i maskowania za pomocą00110
(sześciu), aby uzyskać zero dlaAT
lubCG
niezerowe w przeciwnym razie. W końcu zwracamy wartość true, jeśli wszystkie pary zgromadzą wynik zerowy, wb
przeciwnym razie false.Program testowy:
źródło
𝔼𝕊𝕄𝕚𝕟, 13 znaków / 17 bajtów
Try it here (Firefox only).
Wyjaśnienie
Transliteruj dane wejściowe od
ACGT
doTGCA
i sprawdź, czy wynikowy ciąg jest palindromem.źródło