Problema
Crie uma função que possa determinar se uma sequência de DNA arbitrária é ou não um palíndromo Watson-Crick. A função pegará uma sequência de DNA e produzirá um valor verdadeiro se a sequência for um palíndromo Watson-Crick e um valor falso, se não for. (Verdadeiro e Falso também podem ser representados como 1 e 0, respectivamente.)
A cadeia de DNA pode estar em maiúsculas ou minúsculas, dependendo da sua preferência.
Além disso, a cadeia de DNA não estará vazia.
Explicação
Uma cadeia de DNA é um palíndromo de Watson-Crick quando o complemento de seu reverso é igual a si próprio.
Dada uma sequência de DNA, primeiro inverta-a e depois complemente cada caractere de acordo com as bases de DNA (A ↔ T e C ↔ G). Se a cadeia original for igual à cadeia de reversão complementada, será um palíndromo de Watson-Crick.
Para mais, veja esta pergunta . É um desafio diferente, onde você deve encontrar a substring mais longa de uma cadeia de DNA em que essa substring é um palíndromo de Watson-Crick.
Objetivo
Este é o código-golfe e o código mais curto vence.
Casos de teste
O formato é <input> = <output>
.
ATCGCGAT = true
AGT = false
GTGACGTCAC = true
GCAGTGA = false
GCGC = true
AACTGCGTTTAC = false
ACTG = false
fonte
Respostas:
05AB1E ,
107 bytesCódigo:
Explicação:
Para verificar se uma string é um palíndromo, precisamos apenas verificar a entrada com a entrada, com
at
swapped ecg
swapped e depois revertê-la. Então é isso que vamos fazer. Nós pressionamos a entrada e a entrada foi revertida usandoÂ
(bifurcado). Agora vem uma parte complicada.'š×
é a versão compactada paracreating
. Se a revertermos, você poderá ver por que está no código:Isso será usado para transliterar a entrada reversa. A transliteração é feita com
‡
. Depois disso, apenas verificamos se a entrada e a entrada transliterada sãoQ
iguais e imprimimos esse valor. Então é assim que a pilha se parece com a entradaactg
:O que também pode ser visto com o sinalizador de depuração ( tente aqui ).
Usa a codificação CP-1252 . Experimente online! .
fonte
Geléia , 9 bytes
Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
lambda s:
. Essa é quase a solução completa!Python 2,
564544 bytesfonte
lambda s:s==s[::-1].translate("TCG_A"*99)
trabalha em Python 3Perl, 27 bytes
Inclui +2 para
-lp
Dê entrada no STDIN, imprima 1 ou nada:
dnapalin.pl
:Substitua
$_=
por$_+=
para obter em0
vez de vazio para o caso falsofonte
Pitão - 10 bytes
Experimente online aqui .
Isso seria 9 bytes após a correção do bug, o que a torna não competitiva: Experimente online aqui .
fonte
Retina ,
3433 bytesExperimente online!(Ligeiramente modificado para executar todos os casos de teste de uma vez.)
Explicação
Duplique a entrada correspondendo ao final da sequência e inserindo a
;
seguida por toda a entrada.Combine apenas a segunda metade da entrada
;.+
e execute a substituição de pares por uma transliteração. Quanto ao conjunto de destinoRo
:o
referencia o outro conjunto, queo
é substituído porACGT
. MasR
inverte esse conjunto, então os dois conjuntos são realmente:Se a entrada for um palíndromo de DNA, agora teremos a entrada seguida pelo seu reverso (separado por
;
).Repetidamente (
+
) remova um par de caracteres idênticos ao redor do;
. Isso continuará até que apenas o;
seja deixado ou até que os dois caracteres ao redor;
não sejam mais idênticos, o que significaria que as seqüências não são o inverso uma da outra.Verifique se o primeiro caractere é
;
e imprima0
ou de1
acordo.fonte
JavaScript (ES6), 59 bytes
O melhor que pude fazer sem usar o Regexp foi de 62 bytes:
fonte
Ruby, 35
Tentei de outras maneiras, mas a maneira óbvia foi a mais curta:
no programa de teste
fonte
->s{s.==s.reverse.tr'ACGT','TGCA'}
é um byte menor.
. O código parece mais correto para mim sem ele, mas é necessário para fazê-lo funcionar. Está documentado em algum lugar?==
como um método do que como um operador, mas a busca por símbolos é impossível.Haskell,
4845 bytesExemplo de uso:
(==)=<<reverse.map((cycle"_T_GA__C"!!).fromEnum) $ "ATCGCGAT"
->True
.Uma versão não-pointfree é
Edit: @Mathias Dolidon salvou 3 bytes. Obrigado!
fonte
cycle "TCG_A"
também. :)Retina, 52 bytes
fonte
Julia,
4738 bytesEsta é uma função anônima que aceita uma
Char
matriz e retorna um booleano. Para chamá-lo, atribua-o a uma variável.Isso usa o algoritmo de Dennis, que é mais curto que a solução ingênua. Obtemos o restante de cada ponto de código dividido por 8, adicionamos isso a ele próprio, invertemos, obtemos os restantes da divisão por 5 e verificamos se todos são 0. O último passo é realizado usando
⊆
a versão infix deissubset
, que lança os dois argumentos paraSet
antes de verificar. Isso significa que[0,0,0]
é declarado um subconjunto de0
, desdeSet([0,0,0]) == Set(0)
. Isso é mais curto que uma verificação explícita contra 0.Experimente online!
Economizou 9 bytes graças a Dennis!
fonte
Jolf, 15 bytes
Tente!
Explicação:
fonte
Jolf, 16 bytes
Try it here!
Explanation
fonte
Actually, 19 bytes
This uses Dennis's algorithm.
Try it online!
Explanation:
fonte
Oracle SQL 11.2, 68 bytes
fonte
Julia 0.4, 22 bytes
The string contains the control characters EOT (4) and NAK (21). Input must be in form of a character array.
This approach XORs the characters of the input with the corresponding characters in the reversed input. For valid pairings, this results in the characters EOT or NAK. Testing for inclusion in the string of those characters produces the desired Boolean.
Try it online!
fonte
C,71
2 bytes saved by Dennis. Additional 2 bytes saved by adapting for lowercase input: constants
37
and21
are revised to5
and2
.C,75
Saved one byte: Eliminated parenthesis by taking the product of the two ASCII codes mod 37. The valid pairs evaluate to 21. Assumes uppercase input.
C,76
Uses the fact that ASCII codes of the valid pairs sum to 138 or 149. When taken mod 11, these are the only pairs that sum to 6. Assumes uppercase input.
ungolfed in test program
fonte
r,e;f(char*s){for(r=0,e=strlen(s)+1;*s;s++)r|=*s*s[e-=2]%37^21;return!r;}
saves a couple of bytes.!=
>^
myself. I reduced another 2 by changing to lowercase input: both magic numbers are now single digit.Factor, 72 bytes
Unfortunately regex can't help me here.
Reverse, lookup table, compare equal.
fonte
Bash + coreutils,
4332 bytesTestes:
fonte
J - 21 bytes
Baseado no método de Dennis
Uso
Explicação
fonte
Labirinto , 42 bytes
Termina com um erro de divisão por zero (mensagem de erro em STDERR).
Experimente online!
O layout parece realmente ineficiente, mas agora não estou vendo uma maneira de jogar golfe.
Explicação
Esta solução é baseada no truque aritmético de Dennis: pegue todos os módulos de códigos de caracteres
8
, adicione um par de ambas as extremidades e verifique se é divisível por5
.Primário labirinto:
O código começa com um pequeno loop 2x2 no sentido horário, que lê todos os módulos de entrada 8:
Agora
;
descarta o-1
. Entramos em outro loop no sentido horário que move o topo da pilha principal (ou seja, o último caractere) para baixo:Agora há um pequeno bit linear:
O IP está agora em uma junção que atua como uma ramificação para testar a divisibilidade em 5. Se o resultado do módulo for diferente de zero, sabemos que a entrada não é um palíndromo de Watson-Crick e viramos para o leste:
Caso contrário, precisamos continuar verificando o restante da entrada, para que o IP continue indo para o sul. Ele
{
puxa a parte inferior da entrada restante. Se esgotarmos a entrada, será um0
(na parte inferior do aux ) e o IP continuará se movendo para o sul:Caso contrário, há mais caracteres na sequência a serem verificados. O IP vira para oeste e passa para o próximo loop 2x2 (no sentido horário), que consiste basicamente de no-ops:
Após esse loop, temos a entrada na pilha principal novamente, exceto seu primeiro e último caractere e com um zero no topo. Ele
;
descarta0
e=
troca as partes superiores das pilhas, mas isso é apenas para cancelar o primeiro=
no loop, porque agora estamos inserindo o loop em um local diferente. Enxague e repita.fonte
sed,
6761 bytes(67 bytes)
Teste
Saída
Usando expressões regulares estendidas, a contagem de bytes pode ser reduzida para 61.
fonte
C #, 65 bytes
O .NET possui alguns nomes de método de estrutura bastante longos às vezes, o que não é necessariamente o melhor framework de golfe de código. Nesse caso, os nomes dos métodos da estrutura compõem 33 caracteres em 90. :)
Com base no truque de módulo de outro lugar no segmento:
Agora pesa 67 caracteres, dos quais 13 são nomes de métodos.
Outra otimização menor para cortar dois caracteres impressionantes:
Portanto, 65 dos quais 13 são nomes de estrutura.
Edit: Omitir parte do "clichê" limitado da solução e adicionar algumas condições nos deixa com a expressão
O que fornece 0 se e somente se a sequência s for uma resposta válida. Como o gato aponta, "bool F (string s) =>" é realmente substituível por "s =>" se estiver claro no código que a expressão é a
Func<string,bool>
, ie. mapeia uma string para um booleano.fonte
!s.Zip...
vez des.Zip...==0
? (Ou você não pode!
inverter em C #?) Mesmo se não puder negá-lo, você pode deixar de fora qualquer tipo de inversão e declarar em sua resposta que isso retorna <essa coisa> por falsidade e <outro determinista, coisa claramente discernível> para a verdade.REXX 37
fonte
R, 101 bytes
Casos de teste
fonte
strsplit(x,"")[[1]]
is 3 bytes shorter thanunlist(strsplit(x,""))
and, here, is equivalent sincex
is always a single string of character.Octave, 52 bytes
Following Denis's trick ... take the ASCII values mod 8, flip and add together; if every sum is a multiple of five, you're golden.
fonte
f=
assignment; unnamed functions are okay.Clojure/ClojureScript, 49 chars
Works on strings. If the requirements are loosened to allow lists, I can take off the
(list* )
and save 7 chars.fonte
R, 70 bytes
Usage:
fonte
C, 71 bytes
Requires ASCII codes for the relevant characters, but accepts uppercase, lowercase or mixed-case input.
This code maintains two pointers,
s
andp
, traversing the string in opposite directions. At each step, we compare the corresponding characters, settingb
true if they don't match. The matching is based on XOR of the character values:We can see in the above table that we want to record success for
xx10x
and failure for anything else, so we XOR with00100
(four) and mask with00110
(six) to get zero forAT
orCG
and non-zero otherwise. Finally, we return true if all the pairs accumulated a zero result inb
, false otherwise.Test program:
fonte
𝔼𝕊𝕄𝕚𝕟, 13 chars / 17 bytes
Try it here (Firefox only).
Explanation
Transliterate input from
ACGT
toTGCA
and check if the resulting string is a palindrome.fonte