Introducción
El ARN es el primo menos famoso del ADN. Su objetivo principal es controlar la producción de proteínas en las células a través de un proceso llamado traducción . En este desafío, su tarea es implementar una parte de este proceso donde el ARN se divide en codones .
Este desafío está relacionado temáticamente, pero se concentra en otra parte del proceso de traducción.
Codones
Vamos a pensar en el ARN como una larga cadena sobre el alfabeto de pares de bases, AUCG
. En la traducción, el ARN se divide en trozos no superpuestos de tres pares de bases, llamados codones. El proceso comienza en un codón de inicio , AUG
y termina en un codón de parada , uno de UAA
, UAG
o UGA
. Cada codón (excepto los codones de parada) corresponde a un aminoácido, y la cadena de aminoácidos resultante forma la proteína.
Entrada
Su entrada es una cadena de ARN no vacía.
Salida
Su salida es la lista de codones en los que se divide el ARN, en cualquier formato razonable. En este modelo simplificado, el proceso comienza en el codón de inicio más a la izquierdaAUG
, que se incluye en la salida. Termina cuando se encuentra un codón de parada o cuando se nos acaba el ARN. Si la entrada no contiene codón de inicio, la salida será una lista vacía.
Ejemplos
Considere la secuencia de entrada
ACAUGGAUGGACUGUAACCCCAUGC
El análisis comienza en la aparición más a la izquierda de AUG
, en el índice 2. Continúa de la siguiente manera:
AC AUG GAU GGA CUG UAA CCCCAUGC
* ^ ^ ^ +
El codón marcado con *
es el codón de inicio, y los marcados con ^
también son parte de la salida. El codón de parada está marcado con +
. La salida correcta es
AUG,GAU,GGA,CUG
Para la entrada más corta
ACAUGGAUGGACUGU
el proceso va
AC AUG GAU GGA CUG U
* ^ ^ ^
Esta vez, no se encuentra un codón de parada, por lo que el proceso se detiene cuando nos quedamos sin pares de bases. El resultado es el mismo que el anterior.
Reglas y puntaje
Puede escribir un programa completo de una función. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten.
Casos de prueba
GGUACGGAUU ->
GGCGAAAUCGAUGCC -> AUG
ACAUGGAUGGACUGU -> AUG,GAU,GGA,CUG
AUGACGUGAUGCUUGA -> AUG,ACG
UGGUUAGAAUAAUGAGCUAG -> AUG,AGC
ACAUGGAUGGACUGUAACCCCAUGC -> AUG,GAU,GGA,CUG
CUAAGAUGGCAUGAGUAAUGAAUGGAG -> AUG,GCA
AAUGGUUUAAUAAAUGUGAUAUGAUGAUA -> AUG,GUU
UGUCACCAUGUAAGGCAUGCCCAAAAUCAG -> AUG
UAUAGAUGGUGAUGAUGCCAUGAGAUGCAUGUUAAU -> AUG,GUG,AUG,AUG,CCA
AUGCUUAUGAAUGGCAUGUACUAAUAGACUCACUUAAGCGGUGAUGAA -> AUG,CUU,AUG,AAU,GGC,AUG,UAC
UGAUAGAUGUAUGGAUGGGAUGCUCAUAGCUAUAAAUGUUAAAGUUAGUCUAAUGAUGAGUAGCCGAUGGCCUAUGAUGCUGAC -> AUG,UAU,GGA,UGG,GAU,GCU,CAU,AGC,UAU,AAA,UGU
Respuestas:
Retina ,
39383230 bytesEl avance de línea final es significativo.
Salida como una lista separada por salto de línea.
Pruébalo en línea.
Explicación
Esta es una etapa de coincidencia que convierte la entrada en una lista separada por saltos de línea de todas las coincidencias (debido a
!
). La expresión regular en sí coincide con cada codón a partir del primeroAUG
. Logramos esto con dos opciones separadas.AUG
coincide incondicionalmente, para que pueda iniciar la lista de coincidencias. La segunda coincidencia puede ser cualquier codón (...
coincide con cualquiera de los tres caracteres), pero\G
es un ancla especial que garantiza que esto solo coincida inmediatamente después de otra coincidencia. El único problema es que\G
también coincide al principio de la cadena, que no queremos. Dado que la entrada consta solo de caracteres de palabras, usamos\B
(cualquier posición que no sea un límite de palabra) para asegurar que esta coincidencia no se use al comienzo de la entrada.Esto encuentra el primer codón de parada, que coincide
U(AA|AG|GA)
y todo lo que está después, y lo elimina de la cadena. Dado que la primera etapa divide los codones en líneas separadas, sabemos que esta coincidencia está correctamente alineada con el codón de inicio. Usamos\D
(sin dígitos) para que coincida con cualquier carácter, ya.
que no pasaría los avances de línea, y la entrada no contendrá dígitos.fuente
Haskell,
115112 bytesEjemplo de uso:
Cómo funciona:
fuente
JavaScript
88827069 caracteresEjemplo de uso:
fuente
s=>/AUG(...)+?(?=(U(AA|AG|GA)|$))/.exec(s)[0].match(/.../g)
.Python 2, 185 bytes
Explicación Establecer
i
como entrada. Dividirlo desde 'AGO' hasta el final. Dividido en cuerdas de tres. Compruebe si detiene el codón y corte.Pruébalo aquí
fuente
MATL , 57 bytes
Esto usa la versión actual (9.3.1) del lenguaje / compilador.
La entrada y salida son a través de stdin y stdout. La salida está separada por saltos de línea.
Ejemplo
EDITAR (12 de junio de 2016): para adaptarse a los cambios en el idioma,
[]
debe eliminarse. El siguiente enlace incluye esa modificaciónPruébalo en línea!
Explicación
El código se basa en la expresión regular.
Esto coincide con subcadenas empezando con
AUG
, que contienen grupos de tres caracteres (...
) y terminando en cualquieraUAA
,UAG
oUGA
; o terminando al final de la cadena, y en este caso puede haber un último grupo incompleto (.?.?$
). Lookahead ((?=...)
) se usa para que los codones de detención no formen parte de la coincidencia. La coincidencia es perezosa (*?
) para terminar en el primer codón de parada encontrado, si lo hay.fuente
Ruby,
9795787562 bytesNo juego mucho golf, así que estoy seguro de que se puede mejorar.
Editar:
Robóel excelente\B\G
truco de Martin Büttnerfuente