Problema
Cree una función que pueda determinar si una cadena de ADN arbitraria es un palíndromo de Watson-Crick. La función tomará una cadena de ADN y generará un valor verdadero si la cadena es un palíndromo de Watson-Crick y un valor falso si no lo es. (Verdadero y falso también se puede representar como 1 y 0, respectivamente).
La cadena de ADN puede estar en mayúsculas o en minúsculas, según su preferencia.
Además, la cadena de ADN no estará vacía.
Explicación
Una cadena de ADN es un palíndromo de Watson-Crick cuando el complemento de su reverso es igual a sí mismo.
Dada una cadena de ADN, primero inviértala y luego complemente cada carácter de acuerdo con las bases de ADN (A ↔ T y C ↔ G). Si la cadena original es igual a la cadena inversa complementada, es un palíndromo de Watson-Crick.
Para más información, vea esta pregunta . Es un desafío diferente donde debes encontrar la subcadena más larga de una cadena de ADN donde esa subcadena es un palíndromo de Watson-Crick.
Gol
Este es el código de golf y gana el código más corto.
Casos de prueba
El formato es <input> = <output>
.
ATCGCGAT = true
AGT = false
GTGACGTCAC = true
GCAGTGA = false
GCGC = true
AACTGCGTTTAC = false
ACTG = false
Respuestas:
05AB1E ,
107 bytesCódigo:
Explicación:
Para verificar si una cadena es un palíndromo, solo necesitamos verificar la entrada con la entrada,
at
intercambiada ecg
intercambiada y luego invertirla. Entonces eso es lo que vamos a hacer. Empujamos la entrada y la entrada se invierte usandoÂ
(bifurcar). Ahora viene una parte difícil.'š×
es la versión comprimida paracreating
. Si lo revertimos, puede ver por qué está en el código:Esto se usará para transliterar la entrada invertida. La transliteración se hace con
‡
. Después de eso, simplemente verificamos si la entrada y la entrada transliterada son eQ
e imprimimos ese valor. Así es como se ve la pila para la entradaactg
:Que también se puede ver con el indicador de depuración ( Pruébelo aquí ).
Utiliza la codificación CP-1252 . Pruébalo en línea! .
fuente
Jalea , 9 bytes
Pruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
lambda s:
. ¡Esa es casi la solución completa!Python 2,
564544 bytesfuente
lambda s:s==s[::-1].translate("TCG_A"*99)
funciona en Python 3Perl, 27 bytes
Incluye +2 para
-lp
Dé entrada en STDIN, imprime 1 o nada:
dnapalin.pl
:Reemplace
$_=
por$_+=
para obtener en0
lugar de vacío para el caso falsofuente
Pyth - 10 bytes
Pruébelo en línea aquí .
Esto sería 9 bytes después de la corrección de errores, lo que lo hace no competitivo: Pruébelo en línea aquí .
fuente
Retina ,
3433 bytesPruébalo en línea! (Ligeramente modificado para ejecutar todos los casos de prueba a la vez).
Explicación
Duplique la entrada haciendo coincidir el final de la cadena e insertando un
;
seguido por la entrada completa.Haga coincidir solo la segunda mitad de la entrada
;.+
y realice la sustitución de pares con una transliteración. En cuanto al conjunto de destinoRo
: haceo
referencia al otro conjunto, queo
se reemplaza conACGT
. PeroR
invierte este conjunto, por lo que los dos conjuntos son en realidad:Si la entrada es un palíndromo de ADN, ahora tendremos la entrada seguida de su reverso (separados por
;
).Repetidamente (
+
) elimina un par de caracteres idénticos alrededor del;
. Esto continuará hasta que solo;
quede o hasta que los dos caracteres que lo rodean;
ya no sean idénticos, lo que significaría que las cadenas no son opuestas entre sí.Compruebe si el primer carácter es
;
e imprima0
o en1
consecuencia.fuente
JavaScript (ES6), 59 bytes
Lo mejor que pude hacer sin usar Regexp fue 62 bytes:
fuente
Ruby, 35
Intenté otras formas, pero la forma obvia fue la más corta:
en programa de prueba
fuente
->s{s.==s.reverse.tr'ACGT','TGCA'}
es un byte más corto.
sirve eso primero . El código me parece más correcto sin él, pero es necesario para que se ejecute. ¿Está documentado en alguna parte?==
como un método en lugar de un operador, pero la búsqueda por símbolos es imposible.Haskell,
4845 bytesEjemplo de uso:
(==)=<<reverse.map((cycle"_T_GA__C"!!).fromEnum) $ "ATCGCGAT"
->True
.Una versión sin puntos es
Editar: @Mathias Dolidon guardó 3 bytes. ¡Gracias!
fuente
cycle "TCG_A"
también. :)Retina, 52 bytes
fuente
Julia,
4738 bytesEsta es una función anónima que acepta una
Char
matriz y devuelve un valor booleano. Para llamarlo, asígnelo a una variable.Esto utiliza el algoritmo de Dennis, que es más corto que la solución ingenua. Obtenemos el resto de cada punto de código dividido por 8, lo sumamos a sí mismo invertido, obtenemos los restos de la división por 5 y verificamos si todos son 0. El último paso se logra utilizando
⊆
la versión infija deissubset
, que arroja ambos argumentos aSet
antes de verificar. Esto significa que[0,0,0]
se declara un subconjunto de0
, desdeSet([0,0,0]) == Set(0)
. Esto es más corto que una verificación explícita contra 0.Pruébalo en línea!
¡Guardado 9 bytes gracias a Dennis!
fuente
Jolf, 15 bytes
¡Intentalo!
Explicación:
fuente
Jolf, 16 bytes
Pruébalo aquí!
Explicación
fuente
En realidad, 19 bytes
Esto usa el algoritmo de Dennis .
Pruébalo en línea!
Explicación:
fuente
Oracle SQL 11.2, 68 bytes
fuente
Julia 0.4, 22 bytes
La cadena contiene los caracteres de control EOT (4) y NAK (21). La entrada debe estar en forma de una matriz de caracteres.
Este enfoque XORs los caracteres de la entrada con los caracteres correspondientes en la entrada invertida. Para emparejamientos válidos, esto da como resultado los caracteres EOT o NAK. La prueba de inclusión en la cadena de esos caracteres produce el Booleano deseado.
Pruébalo en línea!
fuente
C, 71
2 bytes guardados por Dennis. Se guardan 2 bytes adicionales al adaptarse para la entrada en minúscula: constantes
37
y21
se revisan en5
y2
.C, 75
Se guardó un byte: se eliminó el paréntesis tomando el producto de los dos códigos ASCII mod 37. Los pares válidos se evalúan en 21. Asume una entrada en mayúscula.
C, 76
Utiliza el hecho de que los códigos ASCII de los pares válidos suman 138 o 149. Cuando se toman mod 11, estos son los únicos pares que suman 6. Asume una entrada en mayúsculas.
sin golf en el programa de prueba
fuente
r,e;f(char*s){for(r=0,e=strlen(s)+1;*s;s++)r|=*s*s[e-=2]%37^21;return!r;}
Guarda un par de bytes.!=
>^
a mí mismo. Reduje otros 2 cambiando a minúsculas: ambos números mágicos ahora son de un solo dígito.Factor , 72 bytes
Desafortunadamente, la expresión regular no puede ayudarme aquí.
Invertir, tabla de búsqueda, comparar igual.
fuente
Bash + coreutils,
4332 bytesPruebas:
fuente
J - 21 bytes
Basado en el método de Dennis
Uso
Explicación
fuente
Laberinto , 42 bytes
Termina con un error de división por cero (mensaje de error en STDERR).
Pruébalo en línea!
El diseño se siente realmente ineficiente, pero no estoy viendo una forma de jugar golf en este momento.
Explicación
Esta solución se basa en el truco aritmético de Dennis: tome todos los módulos de caracteres
8
, agregue un par de ambos extremos y asegúrese de que sea divisible por5
.Imprimación de laberinto:
El código comienza con un pequeño bucle de 2x2 en sentido horario, que lee todas las entradas del módulo 8:
Ahora
;
descarta el-1
. Entramos en otro bucle en el sentido de las agujas del reloj que mueve la parte superior de la pila principal (es decir, el último carácter) hacia abajo:Ahora hay un bit lineal corto:
La IP está ahora en una unión que actúa como una rama para probar la divisibilidad entre 5. Si el resultado del módulo no es cero, sabemos que la entrada no es un palíndromo de Watson-Crick y giramos hacia el este:
De lo contrario, debemos seguir verificando el resto de la entrada, para que la IP siga yendo hacia el sur. El
{
tira sobre la parte inferior de la entrada restante. Si hemos agotado la entrada, esta será una0
(desde la parte inferior de aux ), y la IP continúa moviéndose hacia el sur:De lo contrario, hay más caracteres en la cadena para verificar. La IP gira hacia el oeste y pasa al siguiente ciclo 2x2 (en el sentido de las agujas del reloj) que consiste en gran medida en no-ops:
Después de este bucle, tenemos la entrada en la pila principal nuevamente, excepto por su primer y último carácter y con un cero en la parte superior. Los
;
descartes de la0
y luego=
intercambia la parte superior de las pilas, pero esto es sólo para cancelar la primera=
en el circuito, porque estamos entrando ahora en el bucle en una ubicación diferente. Enjuague y repita.fuente
sed,
6761 bytes(67 bytes)
Prueba
Salida
Mediante el uso de expresiones regulares extendidas, el recuento de bytes se puede reducir a 61.
fuente
C #, 65 bytes
.NET a veces tiene algunos nombres de métodos de framework bastante largos, lo que no necesariamente es el mejor framework de golf de código. En este caso, los nombres de los métodos del marco constituyen 33 caracteres de 90. :)
Según el truco del módulo de otra parte del hilo:
Ahora pesa 67 caracteres de los cuales 13 son nombres de métodos.
Otra optimización menor para eliminar 2 caracteres:
Entonces, 65 de los cuales 13 son nombres de marco.
Editar: Omitir algunas de las "repeticiones" limitadas de la solución y agregar un par de condiciones nos deja con la expresión
Lo que da 0 si y solo si la cadena s es una respuesta válida. Como señala cat, "bool F (string s) =>" en realidad es reemplazable por "s =>" si de lo contrario está claro en el código que la expresión es a
Func<string,bool>
, es decir. asigna una cadena a un booleano.fuente
!s.Zip...
lugar des.Zip...==0
? (¿O no puede!
inscribirse en C #?) Incluso si no puede negarlo booleanamente, puede omitir cualquier tipo de inversión y declarar en su respuesta que esto devuelve <esta cosa> por falsedad y <esta otra determinación, cosa claramente discernible> para la verdad.REXX 37
fuente
R, 101 bytes
Casos de prueba
fuente
strsplit(x,"")[[1]]
es 3 bytes más corto queunlist(strsplit(x,""))
y, aquí, es equivalente yax
que siempre es una sola cadena de caracteres.Octava, 52 bytes
Siguiendo el truco de Denis ... tome los valores ASCII mod 8, voltee y sume; Si cada suma es un múltiplo de cinco, eres dorado.
fuente
f=
tarea; funciones sin nombre están bien.Clojure / ClojureScript, 49 caracteres
Funciona en cuerdas. Si los requisitos se aflojan para permitir listas, puedo quitar
(list* )
y guardar 7 caracteres.fuente
R, 70 bytes
Uso:
fuente
C, 71 bytes
Requiere códigos ASCII para los caracteres relevantes, pero acepta entradas en mayúsculas, minúsculas o mayúsculas y minúsculas.
Este código mantiene dos punteros
s
yp
atraviesa la cadena en direcciones opuestas. En cada paso, comparamos los caracteres correspondientes, estableciendob
verdadero si no coinciden. La coincidencia se basa en XOR de los valores de los caracteres:Podemos ver en la tabla anterior que queremos registrar el éxito
xx10x
y el fracaso de cualquier otra cosa, por lo que XOR con00100
(cuatro) y enmascarar con00110
(seis) para obtener cero paraAT
oCG
no cero de lo contrario. Finalmente, devolvemos verdadero si todos los pares acumularon un resultado cerob
, falso de lo contrario.Programa de prueba:
fuente
𝔼𝕊𝕄𝕚𝕟, 13 caracteres / 17 bytes
Try it here (Firefox only).
Explicación
Transliterate de entrada de
ACGT
aTGCA
y comprobar si la cadena resultante es un palíndromo.fuente