Comme vous le savez peut-être, dans l' ADN, il existe quatre bases: l'adénine ( A
), la cytosine ( C
), la guanine ( G
) et la thymine ( T
). Se A
lie généralement à T
et se C
lie à G
, formant les "échelons" de la structure à double hélice d'ADN .
Nous définissons le complément d'une base comme étant la base à laquelle elle se lie - c'est-à-dire le complément de A
is T
, le complément de T
is A
, le complément de C
is G
et le complément de G
is C
. Nous pouvons également définir le complément d'une chaîne d'ADN comme étant la chaîne avec chaque base complémentée, par exemple le complément de GATATC
isCTATAG
.
Du fait de la structure double brin de l'ADN, les bases d'un brin sont complémentaires des bases de l'autre brin. Cependant, l'ADN a une direction et la transcription de l'ADN se produit dans des directions opposées sur les deux brins. C'est pourquoi les biologistes moléculaires s'intéressent souvent au complément inverse d'une chaîne d'ADN - littéralement à l'inverse du complément de la chaîne.
Pour étendre notre exemple précédent, le complément inverse de GATATC
est CTATAG
vers l'arrière, donc GATATC
. Comme vous l'avez peut-être remarqué, dans cet exemple, le complément inverse est égal à la chaîne d'origine - nous appelons une telle chaîne un palindrome inverse . *
Étant donné une chaîne d'ADN, pouvez-vous trouver la plus longue sous-chaîne qui est un palindrome inversé?
* J'utilise le terme "palindrome inversé", tiré de Rosalind , pour me différencier de la signification habituelle de palindrome.
Contribution
L'entrée sera une chaîne unique composée uniquement des caractères ACGT
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 (ce dernier choix n'est disponible que dans le cas d'une fonction).
Votre programme doit générer la sous-chaîne palindromique inverse la plus longue de la chaîne d'entrée, s'il existe une solution unique. Si plusieurs solutions existent, vous pouvez soit en sortir une seule, soit toutes (votre choix). Les doublons sont corrects si vous choisissez de les sortir tous.
L'entrée est garantie d'avoir une solution d'au moins longueur 2.
Exemple travaillé
ATGGATCCG -> GGATCC
Le complément inverse de GGATCC
est lui-même ( GGATCC --complement--> CCTAGG --reverse--> GGATCC
), tout GGATCC
comme un palindrome inversé.GATC
est également un palindome inversé, mais ce n'est pas le plus long.
Cas de test
AT -> AT
CGT -> CG
AGCA -> GC
GATTACA -> AT, TA
ATGGATCCG -> GGATCC
CCCCCGGGGG -> CCCCCGGGGG
ACATATATAGACT -> ATATAT, TATATA
ATTCGATCTATGTAAAGAGG -> TCGA, GATC
CGCACGTCTACGTACCTACGTAG -> CTACGTAG
TCAATGCATGCGGGTCTATATGCAT -> ATGCAT, GCATGC [, ATGCAT]
CGCTGAACTTTGCCCGTTGGTAGAACGGACTGATGTGAACGAGTGACCCG -> CG, GC, TA, AT [, GC, CG, CG, CG, CG]
CTCGCGTTTGCATAACCGTACGGGCGGAACAGTCGGCGGTGCCTCCCAGG -> CCGTACGG
Notation
C'est le golf de code, donc la solution dans le moins d'octets gagne.
Réponses:
Pyth,
37 36 2824 octetsCombinant les conseils de FryAmTheEggman et l'astuce de vérification du palindrome inversé de Peter, il s'agit d'une version super courte.
Cependant, cela ne fonctionne qu'avec Pyth 3.0.1 que vous pouvez télécharger à partir de ce lien et exécuter comme
(Linux bash uniquement. Sous Windows, appuyez sur Entrée au lieu de <<< puis tapez l'entrée)
Ceci est ma soumission précédente - solution de 28 octets
Merci à FryAmTheEggman pour cette version. Celui-ci crée tous les sous-ensembles possibles de la chaîne d'ADN d'entrée, filtre les sous-ensembles à condition que le sous-ensemble soit une sous-chaîne d'entrée et que l'inverse de la transformation soit égal au sous-ensemble lui-même.
En raison de toutes les créations de sous-ensembles possibles, cela prend encore plus de mémoire que la réponse de Peter.
Ceci est ma première soumission - solution de 36 octets.
Ceci est la traduction exacte de ma réponse CJam . J'espérais que ce serait beaucoup plus petit, mais il s'avère que le manque de méthode de traduction rendait la taille presque similaire (toujours 2 octets plus petits cependant)
Essayez-le en ligne ici
la source
Uz
est équivalent àUlz
.J"ACGT"eolNf&}TzqTjk_m@_JxJdTyz
L'utilisationy
pour les sous-ensembles, puis le filtrage des chaînes qui ne sont pas des sous-chaînesz
est plus courte :)y
est déjà trié par longueur. Vous pouvez simplement faireef...
GolfScript (
3534 octets)À des fins de test, vous souhaiterez peut-être utiliser
ce qui ajoute un
.&
pour réduire l'effort dupliqué.Dissection
la source
q{]{__(;\);}%~}h]{:c:i6f&_4f^W%=}=
dans CJam. Même taille. Ne l'essayez pas dans le compilateur en ligne pour quelque chose de plus grand que 7 entrées de longueurCJam,
3938 octetsJe suis sûr que cela peut être joué plus loin ...
Prend la chaîne d'ADN de STDIN et sort l'ADN palindromique inverse le plus long vers STDOUT
Essayez-le en ligne ici
(Explication bientôt) (Enregistré 1 octet grâce à Peter)
la source
Python 3, 125 caractères
Regardez ma, pas d'indexation! (Eh bien, sauf pour inverser la chaîne, cela ne compte pas.)
L'itération sur les sous-chaînes se fait en retirant les caractères de l'avant et de la fin à l'aide d'une affectation étoilée . La boucle externe supprime les caractères pour le début de
S
, et pour chacun de ces suffixes,s
boucle sur tous ses préfixes, les testant un par un.Le test du palindrome inversé est effectué par le code
qui vérifie que chaque symbole et son homologue à chaîne inversée sont l'un de "AT", "TA", "CG" et "GC". J'ai également trouvé une solution basée sur un ensemble pour être plus courte d'un caractère, mais perd deux caractères en exigeant des parens externes lorsqu'elle est utilisée.
Cela semble toujours pouvoir être raccourci.
Enfin, le palindrome le plus long est imprimé.
J'espère que les sorties séparées par des espaces sont OK. Si une liste aussi bien, l'étoile pourrait être supprimée. J'avais plutôt essayé de suivre le max en cours d'exécution dans la boucle, ainsi que de bourrer les boucles internes dans une compréhension de liste afin de pouvoir prendre le max directement sans construire
l
, et les deux se sont avérés légèrement plus longs. Mais, il était suffisamment proche pour qu'il soit difficile de dire quelle approche est la meilleure.la source
J (45)
Il s'agit d'une fonction qui prend une chaîne:
Explication:
la source
Perl - 59 octets
En comptant le shebang comme un, l'entrée est prise
STDIN
.Exemple d'utilisation:
la source
Python 2 - 177 octets
Force brute simple. La vérification «palindromique inverse» est la seule partie intéressante. Ici, il est écrit de manière plus lisible:
Je fais cela sur toutes les sous-chaînes possibles et les mets dans une liste si c'est vrai. Si c'est faux, j'ai mis une chaîne vide à la place. Lorsque toutes les vérifications sont terminées, je génère l'élément le plus long de la liste. J'ai utilisé une chaîne vide car elle économise des octets au lieu de ne rien y mettre, mais cela signifie également que le programme ne s'étouffera pas s'il n'y a pas de solution. Il génère une ligne vide et se termine normalement.
la source
s=raw_input();r,l,g=range,len(s),'TGCA';print max([a for a in[s[i:j+1]for i in r(l)for j in r(i,l)]if[g[n]for n in[~g.find(c)for c in a]]==list(a)[::-1]],key=len)
. En outre, pour les chaînes, utilisezfind
plusindex
:)