Problème
Créez une fonction qui peut déterminer si une chaîne d'ADN arbitraire est un palindrome Watson-Crick. La fonction prendra une chaîne d'ADN et affichera une vraie valeur si la chaîne est un palindrome Watson-Crick et une fausse valeur si ce n'est pas le cas. (Vrai et faux peuvent également être représentés par 1 et 0, respectivement.)
La chaîne d'ADN peut être en majuscules ou en minuscules selon votre préférence.
De plus, la chaîne d'ADN ne sera pas vide.
Explication
Une chaîne d'ADN est un palindrome de Watson-Crick lorsque le complément de son revers est égal à lui-même.
Étant donné une chaîne d'ADN, inversez-la d'abord, puis complétez chaque caractère en fonction des bases d'ADN (A ↔ T et C ↔ G). Si la chaîne d'origine est égale à la chaîne inversée complémentée, il s'agit d'un palindrome Watson-Crick.
Pour en savoir plus, consultez cette question . C'est un défi différent où vous devez trouver la plus longue sous-chaîne d'une chaîne d'ADN où cette sous-chaîne est un palindrome Watson-Crick.
Objectif
C'est le code-golf et le code le plus court l'emporte.
Cas de test
Le format est <input> = <output>
.
ATCGCGAT = true
AGT = false
GTGACGTCAC = true
GCAGTGA = false
GCGC = true
AACTGCGTTTAC = false
ACTG = false
Réponses:
05AB1E ,
107 octetsCode:
Explication:
Pour vérifier si une chaîne est un palindrome, il suffit de vérifier l'entrée avec l'entrée, avec
at
swapped etcg
swapped puis de l'inverser. Voilà donc ce que nous allons faire. Nous poussons l'entrée et l'entrée inversée en utilisantÂ
(bifurquer). Vient maintenant une partie délicate.'š×
est la version compressée pourcreating
. Si nous l'inversons, vous pouvez voir pourquoi c'est dans le code:Cela sera utilisé pour translittérer l'entrée inversée. La translittération se fait avec
‡
. Après cela, nous vérifions simplement si l'entrée et l'entrée translittérée sont eQ
uales et imprimons cette valeur. Voici donc à quoi ressemble la pile pour l'entréeactg
:Ce qui peut également être vu avec le drapeau de débogage ( essayez-le ici ).
Utilise le codage CP-1252 . Essayez-le en ligne! .
la source
Gelée , 9 octets
Essayez-le en ligne! ou vérifier tous les cas de test .
Comment ça marche
la source
lambda s:
. C'est presque la solution complète!Python 2,
564544 octetsla source
lambda s:s==s[::-1].translate("TCG_A"*99)
fonctionne en Python 3Perl, 27 octets
Comprend +2 pour
-lp
Donnez une entrée sur STDIN, imprime 1 ou rien:
dnapalin.pl
:Remplacer
$_=
par$_+=
pour obtenir0
au lieu de vide pour le faux casla source
Pyth - 10 octets
Essayez-le en ligne ici .
Ce serait 9 octets après la correction du bug qui le rend non concurrentiel: essayez-le en ligne ici .
la source
Rétine ,
3433 octetsEssayez-le en ligne! (Légèrement modifié pour exécuter tous les cas de test en même temps.)
Explication
Dupliquez l'entrée en faisant correspondre la fin de la chaîne et en insérant a
;
suivi de l'entrée entière.Faites correspondre uniquement la seconde moitié de l'entrée avec
;.+
et effectuez la substitution des paires avec une translittération. Quant à l'ensemble cibleRo
: faito
référence à l' autre ensemble, quio
est remplacé parACGT
. MaisR
inverse cet ensemble, donc les deux ensembles sont en fait:Si l'entrée est un palindrome d'ADN, nous aurons maintenant l'entrée suivie de son inverse (séparés par
;
).À plusieurs reprises (
+
), supprimez une paire de caractères identiques autour du;
. Cela se poursuivra jusqu'à ce qu'il ne;
reste que le ou jusqu'à ce que les deux caractères autour du;
ne soient plus identiques, ce qui signifierait que les chaînes ne sont pas l'inverse l'une de l'autre.Vérifiez si le premier caractère est
;
et imprimez0
ou en1
conséquence.la source
JavaScript (ES6), 59 octets
Le mieux que je pouvais faire sans utiliser Regexp était de 62 octets:
la source
Rubis, 35
J'ai essayé d'autres moyens, mais le plus évident était le plus court:
dans le programme de test
la source
->s{s.==s.reverse.tr'ACGT','TGCA'}
est un octet plus court.
sert en premier . Le code me semble plus juste sans lui, mais il est nécessaire pour le faire fonctionner. Est-ce documenté quelque part?==
comme une méthode plutôt qu'un opérateur, mais la recherche par symboles est impossible.Haskell,
4845 octetsExemple d'utilisation:
(==)=<<reverse.map((cycle"_T_GA__C"!!).fromEnum) $ "ATCGCGAT"
->True
.Une version sans point est
Edit: @Mathias Dolidon a enregistré 3 octets. Merci!
la source
cycle "TCG_A"
aussi avec . :)Rétine, 52 octets
la source
Julia,
4738 octetsIl s'agit d'une fonction anonyme qui accepte un
Char
tableau et renvoie un booléen. Pour l'appeler, affectez-le à une variable.Cela utilise l'algorithme de Dennis, qui est plus court que la solution naïve. Nous obtenons le reste de chaque point de code divisé par 8, ajoutons-le à lui-même inversé, obtenons les restes de la division par 5 et vérifions si tous sont 0. La dernière étape est accomplie en utilisant
⊆
la version infixe deissubset
, qui convertit les deux arguments enSet
avant de vérifier. Cela signifie que[0,0,0]
est déclaré un sous-ensemble de0
, depuisSet([0,0,0]) == Set(0)
. C'est plus court qu'une vérification explicite contre 0.Essayez-le en ligne!
9 octets enregistrés grâce à Dennis!
la source
Jolf, 15 octets
Essayez le!
Explication:
la source
Jolf, 16 octets
Essayez-le ici!
Explication
la source
En fait, 19 octets
Cela utilise l'algorithme de Dennis .
Essayez-le en ligne!
Explication:
la source
Oracle SQL 11.2, 68 octets
la source
Julia 0,4, 22 octets
La chaîne contient les caractères de contrôle EOT (4) et NAK (21). L'entrée doit être sous la forme d'un tableau de caractères.
Cette approche XOR les caractères de l'entrée avec les caractères correspondants dans l'entrée inversée. Pour les appariements valides, cela donne les caractères EOT ou NAK. Le test d'inclusion dans la chaîne de ces caractères produit le booléen souhaité.
Essayez-le en ligne!
la source
C, 71
2 octets enregistrés par Dennis. 2 octets supplémentaires enregistrés en s'adaptant aux entrées minuscules: constantes
37
et21
sont révisés en5
et2
.C, 75
Un octet enregistré: parenthèses éliminées en prenant le produit des deux codes ASCII mod 37. Les paires valides valent jusqu'à 21. Suppose une entrée en majuscules.
C, 76
Utilise le fait que les codes ASCII des paires valides totalisent 138 ou 149. Lorsqu'ils sont pris en mod 11, ce sont les seules paires qui totalisent 6. Suppose une entrée en majuscule.
programme non testé
la source
r,e;f(char*s){for(r=0,e=strlen(s)+1;*s;s++)r|=*s*s[e-=2]%37^21;return!r;}
enregistre quelques octets.!=
>^
moi - même. J'ai réduit encore 2 en changeant en entrée minuscule: les deux nombres magiques sont maintenant à un seul chiffre.Facteur , 72 octets
Malheureusement, regex ne peut pas m'aider ici.
Inverser, table de recherche, comparer égal.
la source
Bash + coreutils,
4332 octetsTests:
la source
J - 21 octets
Basé sur la méthode de Dennis
Usage
Explication
la source
Labyrinthe , 42 octets
Se termine par une erreur de division par zéro (message d'erreur sur STDERR).
Essayez-le en ligne!
La disposition semble vraiment inefficace, mais je ne vois tout simplement pas de moyen de jouer au golf en ce moment.
Explication
Cette solution est basée sur l'astuce arithmétique de Dennis: prenez tous les codes de caractères modulo
8
, ajoutez une paire des deux extrémités et assurez-vous qu'elle est divisible par5
.Primaire labyrinthe:
Le code commence par une petite boucle 2x2, dans le sens horaire, qui lit tous les modules d'entrée 8:
;
Jette maintenant le-1
. Nous entrons dans une autre boucle dans le sens des aiguilles d'une montre qui déplace le haut de la pile principale (c'est-à-dire le dernier caractère) vers le bas:Il y a maintenant un petit bit linéaire:
L'IP est maintenant à une jonction qui agit comme une branche pour tester la divisibilité par 5. Si le résultat du modulo est non nul, nous savons que l'entrée n'est pas un palindrome Watson-Crick et nous tournons vers l'est:
Sinon, nous devons continuer à vérifier le reste de l'entrée, afin que l'IP continue de se diriger vers le sud. Le
{
tire sur le bas de l'entrée restante. Si nous avons épuisé l'entrée, ce sera un0
(à partir du bas de aux ), et l'IP continue de se déplacer vers le sud:Sinon, il y a plus de caractères dans la chaîne à vérifier. L'IP se tourne vers l'ouest et se déplace dans la boucle 2x2 suivante (dans le sens des aiguilles d'une montre) qui se compose principalement de no-ops:
Après cette boucle, nous avons à nouveau l'entrée sur la pile principale, à l'exception de son premier et dernier caractère et avec un zéro en haut. Le
;
jette le0
puis=
échange les sommets des piles, mais ceci est juste pour annuler le premier=
de la boucle, car nous entrons maintenant dans la boucle à un emplacement différent. Rincer et répéter.la source
sed,
6761 octets(67 octets)
Tester
Sortie
En utilisant des expressions régulières étendues, le nombre d'octets peut être réduit à 61.
la source
C #, 65 octets
.NET a parfois des noms de méthode de framework assez longs, ce qui ne fait pas nécessairement le meilleur framework de golf de code. Dans ce cas, les noms de méthode de framework représentent 33 caractères sur 90. :)
Basé sur l'astuce du module ailleurs dans le fil:
Pèse désormais 67 caractères, dont 13 sont des noms de méthode.
Une autre optimisation mineure pour raser un énorme 2 caractères:
Donc, 65 dont 13 sont des noms de framework.
Edit: Omettre une partie du «passe-partout» limité de la solution et ajouter quelques conditions nous laisse avec l'expression
Ce qui donne 0 si et seulement si la chaîne s est une réponse valide. Comme le souligne cat, "bool F (string s) =>" est en fait remplaçable par "s =>" s'il est par ailleurs clair dans le code que l'expression est un
Func<string,bool>
, c'est-à-dire. mappe une chaîne à un booléen.la source
!s.Zip...
place des.Zip...==0
? (Ou ne pouvez-vous pas!
entrer en C #?) Même si vous ne pouvez pas le nier booléen, vous pouvez laisser de côté toute sorte d'inversion et indiquer dans votre réponse que cela renvoie <cette chose> pour la falsification et <cet autre déterministe, chose clairement discernable> pour la vérité.REXX 37
la source
R, 101 octets
Cas de test
la source
strsplit(x,"")[[1]]
est 3 octets plus court queunlist(strsplit(x,""))
et, ici, est équivalent puisqu'ilx
s'agit toujours d'une seule chaîne de caractères.Octave, 52 octets
Suivant l'astuce de Denis ... prenez les valeurs ASCII mod 8, retournez et additionnez; si chaque somme est un multiple de cinq, vous êtes en or.
la source
f=
omettre la mission; les fonctions sans nom sont correctes.Clojure / ClojureScript, 49 caractères
Fonctionne sur les cordes. Si les exigences sont assouplies pour autoriser les listes, je peux retirer
(list* )
et enregistrer 7 caractères.la source
R, 70 octets
Usage:
la source
C, 71 octets
Nécessite des codes ASCII pour les caractères appropriés, mais accepte les entrées en majuscules, en minuscules ou en casse mixte.
Ce code maintient deux pointeurs
s
etp
traverse la chaîne dans des directions opposées. À chaque étape, nous comparons les caractères correspondants, en définissantb
true s'ils ne correspondent pas. La correspondance est basée sur XOR des valeurs de caractères:Nous pouvons voir dans le tableau ci-dessus que nous voulons enregistrer le succès
xx10x
et l'échec pour tout le reste, nous avons donc XOR avec00100
(quatre) et masque avec00110
(six) pour obtenir zéro pourAT
ouCG
et non nul sinon. Enfin, nous retournons vrai si toutes les paires ont accumulé un résultat nul dansb
, sinon faux.Programme de test:
la source
𝔼𝕊𝕄𝕚𝕟, 13 caractères / 17 octets
Try it here (Firefox only).
Explication
Translittérer l'entrée de
ACGT
àTGCA
et vérifier si la chaîne résultante est un palindrome.la source