L'ARN , comme l'ADN, est une molécule trouvée dans les cellules codant pour l'information génétique. Il se compose de nucléotides , qui sont représentés par les bases adénine (A), cytosine (C), guanine (G) et uracile (U). * Un codon est une séquence de trois nucléotides.
Les protéines sont de grosses molécules qui remplissent une vaste gamme de fonctions, comme la kératine qui se trouve dans les cheveux et les ongles et l'hémoglobine qui transporte l'oxygène dans les cellules sanguines. Ils sont constitués d' acides aminés , qui sont codés en tant que codons dans les molécules d'ARN. Parfois, différents codons peuvent coder pour le même acide aminé. Chaque acide aminé est généralement représenté par une seule lettre, par exemple H représente l'histidine.
Étant donné une séquence de ACGU
, pouvez-vous la traduire dans la chaîne de protéines correspondante?
* L'ADN est constitué d'ACGT, où le T est la thymine. Lors de la transcription de l'ADN en ARN, la thymine est remplacée par l'uracile.
Contribution
L'entrée sera une chaîne unique composée uniquement des caractères ACGU
en majuscules. Vous pouvez écrire une fonction ou un programme complet pour ce défi.
Production
Vous pouvez choisir de sortir via l'impression ou le retour d'une chaîne (ce dernier choix n'est disponible que dans le cas d'une fonction).
La traduction devrait commencer à un codon de départ ( AUG
représenté comme M
) et se terminent à un codon stop (un UAA
, UAG
ou UGA
, comme représenté *
). Il y a quatre cas où l'entrée peut être invalide:
- L'entrée ne commence pas par un codon de démarrage
- L'entrée ne se termine pas par un codon d'arrêt
- La longueur de l'entrée n'est pas un multiple de 3
- L'entrée contient un codon d'arrêt ailleurs qu'à la fin
Dans tous ces cas, Error
devrait être sorti. Notez que, contrairement aux codons d'arrêt, les codons de démarrage peuvent apparaître après le début de la chaîne.
Sinon, vous devez convertir chaque codon en son acide aminé respectif via le tableau de codon d'ARN suivant :
* 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
... et sortir la chaîne traduite.
Exemples
Cas non valides:
<empty string> -> Error
AUG -> Error
UAA -> Error
AUGCUAG -> Error
AAAAAAA -> Error
GGGCACUAG -> Error
AUGAACGGA -> Error
AUGUAGUGA -> Error
AUGUUUGUUCCGUCGAAAUACCUAUGAACACGCUAA -> Error
Cas valides:
AUGUGA -> M*
AUGAGGUGUAGCUGA -> MRCS*
AUGGGUGAGAAUGAAACGAUUUGCAGUUAA -> MGENETICS*
AUGCCAGUCGCACGAUUAGUUCACACGCUCUUGUAA -> MPVARLVHTLL*
AUGCUGCGGUCCUCGCAUCUAGCGUUGUGGUUAGGGUGUGUAACUUCGAGAACAGUGAGUCCCGUACCAGGUAGCAUAAUGCGAGCAAUGUCGUACGAUUCAUAG -> MLRSSHLALWLGCVTSRTVSPVPGSIMRAMSYDS*
AUGAAAAACAAGAAUACAACCACGACUAGAAGCAGGAGUAUAAUCAUGAUUCAACACCAGCAUCCACCCCCGCCUCGACGCCGGCGUCUACUCCUGCUUGAAGACGAGGAUGCAGCCGCGGCUGGAGGCGGGGGUGUAGUCGUGGUUUACUAUUCAUCCUCGUCUUGCUGGUGUUUAUUCUUGUUUUAA -> MKNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVVYYSSSSCWCLFLF*
Modifier: Ajout de plus de cas de test
Notation
C'est le code golf, donc le code dans le moins d'octets gagne.
Remarque: je ne suis pas un expert en biologie moléculaire, alors n'hésitez pas à me corriger si j'ai quelque chose d'anormal :)
la source
M
et se termine par*
.Réponses:
CJam (
97 93 9291 octets)Il s'agit d'un portage de ma solution GolfScript avec une fonction de hachage légèrement modifiée car, à ma grande surprise, une chose que CJam n'a pas empruntée à GolfScript est de traiter les chaînes comme des tableaux d'entiers.
6 octets enregistrés grâce aux suggestions d' Optimizer (dont deux octets de quelque chose que je pensais avoir essayé et qui n'a pas fonctionné - hein).
la source
q"GACU"f#3/{4b"GGEDAAVVRSKNTTMIRRQHPPLLWC*YSSLF"{_s"MW""I*"er}%=}%s_'*/(1<"M"=*Q="Error"@?
- 90Q
plutôt que[Q]
est juste incorrecte.[Q]
auQ
changement est correct.AUGUAGUGA
[Q]
->Qa
JavaScript (ES6) 167
177caractères codés en UTF8 sous la forme de 167177octets... alors j'espère que tout le monde est content.
Edit En fait, pas besoin d'un cas particulier pour le dernier bloc trop court. Si les 2 (ou 1) derniers caractères ne sont pas mappés, la chaîne de résultat ne se termine pas par '*' et cela donne quand même une erreur.
Expliqué
Chaque caractère d'un triplet peut avoir 4 valeurs, il y a donc exactement 4 ^ 3 == 64 triplets. La fonction C mappe chaque triplet à un nombre compris entre 0 et 63. Aucune vérification d'erreur n'est nécessaire car les caractères d'entrée sont uniquement ACGU.
Chaque triplet correspond à un acide aminé identifié par un seul caractère. Nous pouvons encoder cela dans une chaîne de 64 caractères. Pour obtenir la chaîne, commencez par la carte de codon:
... obtention "KNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVV * Y * YSSSS * CWCLFLF"
Nous pouvons donc scanner la chaîne d'entrée et utiliser la même logique de la fonction C pour obtenir le code 0..63, et à partir du code le caractère aminoacide. La fonction de remplacement divisera la chaîne d'entrée en blocs de 3 caractères, laissant éventuellement 1 ou 2 caractères non gérés (ce qui donnera une chaîne de résultat non valide, ne se terminant pas par '*').
Enfin, vérifiez si la chaîne encodée est valide à l'aide d'une expression rationnelle: elle doit commencer par 'M', ne doit pas contenir '*' et doit se terminer par '*'
Test dans la console FireBug / FireFox
Production
la source
C, 190 octets (fonction)
199194 octets (programme)Enregistré quelques octets en améliorant la formule de hachage.
Voici un cas de test amusant:
Explication
Le triplet de lettres est converti en un nombre de base 4. Chaque lettre est hachée comme suit.
Cela donne un nombre dans la plage
0..63
. L'idée est maintenant d'utiliser une table de recherche similaire à celles utilisées par edc65 et Optimizer. Cependant, le hachage est conçu de sorte que G et A sont côte à côte et U et C sont côte à côte.En regardant la table à https://en.wikipedia.org/wiki/Genetic_code#RNA_codon_table , nous voyons qu'avec les lettres ordonnées de cette manière, généralement le dernier bit peut être ignoré. Seule une table de recherche à 32 caractères est nécessaire, sauf dans deux cas particuliers.
Voir ci-dessous les deux premières lettres et les acides aminés correspondants (où la 3e lettre est G / A et où la 3e lettre est U / C). Les corrections pour les deux cas spéciaux qui ne correspondent pas à la table de 32 caractères sont codées en dur.
Code commenté
Dans la version golfée, le
i%3
code est dans la position d'incrémentation dufor
support, mais il est déplacé dans une position plus lisible dans le code commenté.la source
O
! J'ai cependant ajouté un cas de testMGENETICS*
, car c'est le mot le plus thématique que j'ai pu faire: PCJam,
317 121104 octetsCela peut encore être joué plus loin.
Mis à jour du mécanisme de mappage vers celui utilisé dans la réponse d'edc65. Même si j'ai trouvé ça tout seul, il m'a battu :)
MISE À JOUR : raccourci de la carte de la table des codons en observant le modèle qu'il contient.
Essayez-le en ligne ici
la source
GolfScript (103 octets)
Démo en ligne (NB n'inclut pas les deux plus grands cas de test car il doit s'exécuter en 15 secondes).
Dissection
Comme Steve Verrill l'a souligné dans le bac à sable, la table de recherche peut être réduite à 32 éléments plus deux cas spéciaux. Il s'avère que les cas spéciaux impliquent à la fois des caractères (
M
etW
respectivement) qui n'apparaissent qu'une seule fois, et avec le bon mappage des caractères en base à 4 chiffres, il est possible de construire la table de recherche complète à 64 éléments à partir des 32 éléments en faisant une duplication -et-tr
:Ensuite, une fois le décodage effectué, la validation permet de nombreuses approches. Le plus court que j'ai trouvé est
la source
M
c'était l'un des cas spéciaux pour tester un départ valide, mais cela n'a pas fonctionné de cette façon. Il y a encore 8 paires de lettres identiques dans cette chaîne. Je me demande s'ils peuvent être compressés en lettres minuscules:g-->GG
a-->AA
etc. Si la décompression peut être réalisée en moins de 8 caractères, cela en vaudrait la peine.Python, 473 octets
la source
Python 2,
370358354 octetsIl s'agit d'une approche très simple n'utilisant aucune compression, essayant simplement de regrouper les informations de manière assez dense:
Edit: Rasé quelques caractères suivant la suggestion de xnor.
la source
s
plus court récursivement en tant ques=lambda x:x and[x[:3]]+s(x[3:])
.Scala (317 caractères)
La fonction principale est
f
. Bien sûr, un meilleur choix serait de retourner unOption[String]
.la source
JavaScript (ES6), 143 octets
Essayez-le en ligne!
la source