El ARN , como el ADN, es una molécula que se encuentra en las células que codifican la información genética. Consiste en nucleótidos , que están representados por las bases adenina (A), citosina (C), guanina (G) y uracilo (U). * Un codón es una secuencia de tres nucleótidos.
Las proteínas son moléculas grandes que realizan una amplia gama de funciones, como la queratina que se encuentra en el cabello y las uñas y la hemoglobina que transporta oxígeno en las células sanguíneas. Están formados por aminoácidos , que están codificados como codones en las moléculas de ARN. A veces, codones diferentes pueden codificar para el mismo aminoácido. Cada aminoácido está comúnmente representado por una sola letra, por ejemplo, H significa histidina.
Dada una secuencia de ACGU
, ¿puedes traducirla a la cadena de proteínas correspondiente?
* El ADN consiste en ACGT, donde la T es timina. Durante la transcripción de ADN a ARN, la timina es reemplazada por uracilo.
Entrada
La entrada será una sola cadena que constará solo de los caracteres ACGU
en mayúscula. Puede escribir una función o un programa completo para este desafío.
Salida
Puede elegir imprimir mediante la impresión o la devolución de una cadena (la última opción solo está disponible en el caso de una función).
La traducción debe comenzar en un codón de inicio ( AUG
, representado como M
) y finalizar en un codón de detención (uno de UAA
, UAG
o UGA
, representado como *
). Hay cuatro casos donde la entrada puede ser inválida:
- La entrada no comienza con un codón de inicio
- La entrada no termina con un codón de parada
- La longitud de la entrada no es múltiplo de 3
- La entrada contiene un codón de parada en otro lugar que no sea al final
En todos estos casos, se Error
debe generar. Tenga en cuenta que, a diferencia de los codones de detención, los codones de inicio pueden aparecer después del inicio de la cadena.
De lo contrario, debe convertir cada codón en su aminoácido respectivo a través de la siguiente tabla de codones de ARN :
* 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
... y genera la cadena traducida.
Ejemplos
Casos inválidos:
<empty string> -> Error
AUG -> Error
UAA -> Error
AUGCUAG -> Error
AAAAAAA -> Error
GGGCACUAG -> Error
AUGAACGGA -> Error
AUGUAGUGA -> Error
AUGUUUGUUCCGUCGAAAUACCUAUGAACACGCUAA -> Error
Casos válidos:
AUGUGA -> M*
AUGAGGUGUAGCUGA -> MRCS*
AUGGGUGAGAAUGAAACGAUUUGCAGUUAA -> MGENETICS*
AUGCCAGUCGCACGAUUAGUUCACACGCUCUUGUAA -> MPVARLVHTLL*
AUGCUGCGGUCCUCGCAUCUAGCGUUGUGGUUAGGGUGUGUAACUUCGAGAACAGUGAGUCCCGUACCAGGUAGCAUAAUGCGAGCAAUGUCGUACGAUUCAUAG -> MLRSSHLALWLGCVTSRTVSPVPGSIMRAMSYDS*
AUGAAAAACAAGAAUACAACCACGACUAGAAGCAGGAGUAUAAUCAUGAUUCAACACCAGCAUCCACCCCCGCCUCGACGCCGGCGUCUACUCCUGCUUGAAGACGAGGAUGCAGCCGCGGCUGGAGGCGGGGGUGUAGUCGUGGUUUACUAUUCAUCCUCGUCUUGCUGGUGUUUAUUCUUGUUUUAA -> MKNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVVYYSSSSCWCLFLF*
Editar: se agregaron más casos de prueba
Puntuación
Este es el código de golf, por lo que gana el código en la menor cantidad de bytes.
Nota: No soy un experto en biología molecular, así que siéntete libre de corregirme si he expresado algo incorrecto :)
fuente
M
y termina con*
.Respuestas:
CJam (
97 93 9291 bytes)Este es un puerto de mi solución GolfScript con una función hash ligeramente modificada porque, para mi sorpresa, una cosa que CJam no ha tomado prestada de GolfScript es tratar las cadenas como conjuntos de enteros.
6 bytes guardados gracias a las sugerencias de Optimizer (incluidos dos bytes de algo que pensé que había intentado y no funcionó, eh).
fuente
q"GACU"f#3/{4b"GGEDAAVVRSKNTTMIRRQHPPLLWC*YSSLF"{_s"MW""I*"er}%=}%s_'*/(1<"M"=*Q="Error"@?
- 90Q
lugar de[Q]
simplemente es incorrecta.[Q]
queQ
el cambio es correcto.AUGUAGUGA
[Q]
->Qa
JavaScript (ES6) 167
177caracteres codificados en UTF8 como 167177bytes... así que espero que todos estén felices.
Editar De hecho, no es necesario un caso especial para el último bloque demasiado corto. Si los últimos 2 (o 1) caracteres no están asignados, la cadena de resultados no termina con '*' y eso da error de todos modos.
Explicado
Cada char en un triplete puede tener 4 valores, por lo que hay exactamente 4 ^ 3 == 64 tripletas. La función C asigna cada triplete a un número entre 0 y 63. No se necesita verificación de errores ya que los caracteres de entrada son solo ACGU.
Cada triplete se asigna a un aminoácido identificado por un único carácter. Podemos codificar esto en una cadena de 64 caracteres. Para obtener la cadena, comience con el Mapa de codones:
... obteniendo "KNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVV * Y * YSSSS * CWCLFLF"
Entonces podemos escanear la cadena de entrada y usar la misma lógica de la función C para obtener el código 0..63, y del código el aminoácido char. La función de reemplazo dividirá la cadena de entrada en bloques de 3 caracteres, dejando eventualmente 1 o 2 caracteres no administrados (eso dará una cadena de resultado no válida, que no terminará en '*').
Por último, verifique si la cadena codificada es válida utilizando una expresión regular: debe comenzar con 'M', no debe contener '*' y debe terminar con '*'
Prueba en la consola FireBug / FireFox
Salida
fuente
C, 190 bytes (función)
199194 bytes (programa)Ahorró algunos bytes al mejorar la fórmula hash.
Aquí hay un divertido caso de prueba:
Explicación
El triplete de letras se convierte en un número base 4. Cada letra se codifica de la siguiente manera.
Esto le da un número en el rango
0..63
. La idea ahora es utilizar una tabla de búsqueda similar a las utilizadas por edc65 y Optimizer. Sin embargo, el hash está diseñado para que G y A estén uno al lado del otro y U y C estén uno al lado del otro.Mirando la tabla en https://en.wikipedia.org/wiki/Genetic_code#RNA_codon_table , vemos que con las letras ordenadas de esta manera, generalmente se puede ignorar el último bit. Solo se necesita una tabla de búsqueda de 32 caracteres, excepto en dos casos especiales.
Vea a continuación las dos primeras letras y los aminoácidos correspondientes (donde la tercera letra es G / A y la tercera letra es U / C). Las correcciones para los dos casos especiales que no se ajustan a la tabla de 32 caracteres están codificadas.
Código comentado
En la versión de golf, el
i%3
código está en la posición de incremento delfor
soporte, pero se mueve a una posición más legible en el código comentado.fuente
O
! SinMGENETICS*
embargo, agregué un caso de prueba , porque es la palabra más temática que podría hacer: PCJAM,
317 121104 bytesEsto todavía se puede jugar más al golf.
Se actualizó el mecanismo de mapeo al utilizado en la respuesta de edc65. Aunque se me ocurrió esto por mi cuenta, él me ganó :)
ACTUALIZACIÓN : acortó el mapa de la tabla de codones al observar el patrón en él.
Pruébalo en línea aquí
fuente
GolfScript (103 bytes)
Demostración en línea (NB no incluye los dos casos de prueba más grandes porque debe ejecutarse en 15 segundos).
Disección
Como Steve Verrill señaló en el sandbox, la tabla de búsqueda se puede reducir a 32 elementos más dos casos especiales. Resulta que los casos especiales involucran caracteres (
M
yW
respectivamente) que solo ocurren una vez, y con el mapeo correcto de los caracteres a 4 dígitos base es posible construir la tabla de búsqueda completa de 64 elementos a partir de los 32 elementos haciendo un duplicado -y-tr
:Luego, una vez que hemos hecho la decodificación, la validación permite muchos enfoques. Lo más corto que he encontrado es
fuente
M
era uno de los casos especiales para probar un comienzo válido, pero no ha funcionado de esa manera. Todavía hay 8 pares de letras idénticas en esa cadena. Me pregunto si se pueden comprimir como letras minúsculas:g-->GG
a-->AA
etc. Si la descompresión se puede lograr en menos de 8 caracteres, valdría la pena.Python, 473 bytes
fuente
Python 2,
370358354 bytesEste es un enfoque muy sencillo que no utiliza compresión, solo trata de empaquetar la información con bastante densidad:
Editar: Afeitado algunos caracteres siguiendo la sugerencia de xnor.
fuente
s
más corto de forma recursiva comos=lambda x:x and[x[:3]]+s(x[3:])
.Scala (317 caracteres)
La función principal es
f
. Por supuesto, una mejor opción sería devolver unOption[String]
.fuente
JavaScript (ES6), 143 bytes
Pruébalo en línea!
fuente