O RNA , como o DNA, é uma molécula encontrada nas células que codificam informações genéticas. É constituído por nucleotídeos , que são representados pelas bases adenina (A), citosina (C), guanina (G) e uracil (U). * Um códon é uma sequência de três nucleotídeos.
As proteínas são moléculas grandes que desempenham uma vasta gama de funções, como a queratina, encontrada nos cabelos e unhas, e a hemoglobina, que transporta oxigênio nas células sanguíneas. Eles são compostos de aminoácidos , que são codificados como códons nas moléculas de RNA. Às vezes, códons diferentes podem codificar para o mesmo aminoácido. Cada aminoácido é comumente representado por uma única letra, por exemplo H significa histidina.
Dada uma sequência de ACGU
, você pode traduzi-la na sequência de proteínas correspondente?
* O DNA consiste em ACGT, onde o T é timina. Durante a transcrição do DNA para o RNA, a timina é substituída pelo uracil.
Entrada
A entrada será uma única sequência que consiste apenas nos caracteres ACGU
em maiúsculas. Você pode escrever uma função ou um programa completo para esse desafio.
Resultado
Você pode optar por imprimir ou imprimir uma string (a última opção está disponível apenas no caso de uma função).
A tradução deve começar no códon inicial ( AUG
, representado como M
) e terminar no códon final (um de UAA
, UAG
ou UGA
representado como *
). Há quatro casos em que a entrada pode ser inválida:
- A entrada não começa com um codão de início
- A entrada não termina com um códon de parada
- O comprimento da entrada não é múltiplo de 3
- A entrada contém um códon de parada em outro lugar que não no final
Em todos esses casos, Error
deve ser gerado. Observe que, diferentemente dos códons de parada, os códons de início podem aparecer após o início da string.
Caso contrário, você deve converter cada códon em seu respectivo aminoácido através da seguinte tabela de códons de RNA :
* 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
... e produz a string traduzida.
Exemplos
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*
Edit: Adicionado mais casos de teste
Pontuação
Esse é o código golf, portanto o código com o menor número de bytes vence.
Nota: Eu não sou especialista em biologia molecular, portanto, sinta-se à vontade para me corrigir se eu tiver afirmado algo errado :)
fonte
M
e termina*
.Respostas:
CJam (
97 93 9291 bytes)Esta é uma porta da minha solução GolfScript com uma função de hash levemente aprimorada, porque, para minha surpresa, uma coisa que CJam não pediu emprestado ao GolfScript é tratar as strings como matrizes de números inteiros.
6 bytes salvos graças a sugestões do Optimizer (incluindo dois bytes de algo que eu pensei ter tentado e não funcionou - hein).
fonte
q"GACU"f#3/{4b"GGEDAAVVRSKNTTMIRRQHPPLLWC*YSSLF"{_s"MW""I*"er}%=}%s_'*/(1<"M"=*Q="Error"@?
# 90Q
em vez de[Q]
é apenas incorreta.[Q]
aQ
alteração está correta.AUGUAGUGA
[Q]
->Qa
Caracteres JavaScript (ES6) 167
177codificados em UTF8 como 167177bytes... então espero que todos estejam felizes.
Editar De fato, não há necessidade de um caso especial para o último bloco muito curto. Se os últimos 2 (ou 1) caracteres não forem mapeados, a sequência de resultados não terminará com '*' e isso causará erro de qualquer maneira.
Explicado
Cada caractere em um trigêmeo pode ter 4 valores, portanto, existem exatamente 4 ^ 3 == 64 trigêmeos. A função C mapeia cada trigêmeo para um número entre 0 e 63. Nenhuma verificação de erro é necessária, pois os caracteres de entrada são apenas ACGU.
Cada trigêmeo é mapeado para um aminoácido identificado por um único caractere. Podemos codificar isso em uma cadeia de 64 caracteres. Para obter a string, comece com o Mapa do Codon:
... obtendo "KNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVVV * Y * YSSSS * CWCLFLF"
Portanto, podemos verificar a string de entrada e usar a mesma lógica da função C para obter o código 0..63 e, a partir do código, o aminoácido char. A função de substituição dividirá a sequência de entrada em 3 blocos de caracteres, deixando 1 ou 2 caracteres não gerenciados (que fornecerão uma sequência de resultados inválida, não terminando em '*').
Por fim, verifique se a sequência codificada é válida usando um regexp: ela deve começar com 'M', não deve conter '*' e deve terminar com '*'
Teste no console do FireBug / FireFox
Resultado
fonte
C, 190 bytes (função)
199194 bytes (programa)Economizou alguns bytes melhorando a fórmula de hash.
Aqui está um caso de teste divertido:
Explicação
O trigêmeo de letras é convertido em um número base 4. Cada letra é hash da seguinte maneira.
Isso fornece um número no intervalo
0..63
. A idéia agora é usar uma tabela de pesquisa semelhante à usada pelo edc65 e pelo Optimizer. No entanto, o hash é projetado para que G e A estejam próximos um do outro e U e C estejam próximos um do outro.Observando a tabela em https://en.wikipedia.org/wiki/Genetic_code#RNA_codon_table , vemos que, com as letras ordenadas dessa maneira, geralmente o último bit pode ser ignorado. Apenas uma tabela de pesquisa de 32 caracteres é necessária, exceto em dois casos especiais.
Veja abaixo as duas primeiras letras e os aminoácidos correspondentes (onde a terceira letra é G / A e a terceira letra é U / C). As correções para os dois casos especiais que não se ajustam à tabela de 32 caracteres são codificadas.
Código comentado
Na versão golfed, o
i%3
código está na posição de incremento dofor
suporte, mas é movido para uma posição mais legível no código comentado.fonte
O
! Eu adicionei um caso de teste paraMGENETICS*
que, porque é a palavra mais temática eu poderia fazer: PCJam,
317 121104 bytesIsso ainda pode ser jogado ainda mais.
Atualizado o mecanismo de mapeamento para o usado na resposta do edc65. Mesmo tendo inventado isso sozinho, ele me venceu :)
ATUALIZAÇÃO : Encurtou o mapa da tabela de códons observando o padrão nele.
Experimente online aqui
fonte
GolfScript (103 bytes)
Demonstração online (o NB não inclui os dois maiores casos de teste porque precisa ser executado em 15 segundos).
Dissecação
Como Steve Verrill apontou na sandbox, a tabela de pesquisa pode ser reduzida para 32 elementos mais dois casos especiais. Acontece que os casos especiais envolvem caracteres (
M
eW
respectivamente), que ocorrem apenas uma vez, e com o mapeamento correto dos caracteres para a base de 4 dígitos, é possível criar a tabela de pesquisa completa de 64 elementos a partir dos 32 elementos, fazendo uma duplicata - e -tr
:Depois que decodificamos, a validação permite muitas abordagens. O mais curto que eu encontrei é
fonte
M
era um dos casos especiais para testar um início válido, mas não funcionou dessa maneira. Ainda existem 8 pares de letras idênticas nessa sequência. Gostaria de saber se eles podem ser compactados como letras minúsculas:g-->GG
a-->AA
etc. Se a descompressão puder ser alcançada com menos de 8 caracteres, valerá a pena.Python, 473 bytes
fonte
Python 2,
370358354 bytesEssa é uma abordagem muito direta, sem compactação, apenas tentando compactar as informações bastante densamente:
Edit: Raspou alguns caracteres seguindo a sugestão do xnor.
fonte
s
mais curto recursivamente comos=lambda x:x and[x[:3]]+s(x[3:])
.Scala (317 caracteres)
A função principal é
f
. Obviamente, uma melhor opção seria retornar umOption[String]
.fonte
JavaScript (ES6), 143 bytes
Experimente online!
fonte