Intro
Nous avons eu des histogrammes et des comptages , mais pas tous.
Chaque année, Dyalog Ltd. organise un concours étudiant. Le défi consiste à écrire un bon code APL. Il s'agit d'une édition de code-golf indépendante du langage du sixième problème de cette année.
J'ai l'autorisation explicite de publier ce défi ici de l'auteur original du concours. N'hésitez pas à vérifier en suivant le lien fourni et en contactant l'auteur.
Problème
Le terme k-mer fait généralement référence à toutes les sous-chaînes possibles de longueur k contenues dans une chaîne. En génomique computationnelle, les k-mers font référence à toutes les sous-séquences possibles (de longueur k ) d'une lecture obtenue par séquençage d'ADN. Écrivez une fonction / programme qui prend une chaîne et k (la longueur de la sous-chaîne) et retourne / sort un vecteur des k-mers de la chaîne d'origine.
Exemples
[4,"ATCGAAGGTCGT"]
→ ["ATCG","TCGA","CGAA","GAAG","AAGG","AGGT","GGTC","GTCG","TCGT"]
k > longueur de chaîne? Ne rien retourner / aucun résultat vide:
[4,"AC"]
→ []
ou ""
ou[""]
['A', 'T', 'C', 'G']
au lieu de"ATCG"
?Réponses:
Gelée , 1 octet
La gelée a un atome dyadique à un seul octet pour cette opération
Essayez-le en ligne!(le pied de page divise la liste résultante par des sauts de ligne, pour éviter l'impression d'une représentation musclée.)
la source
Octave, 28 octets
Essayez-le en ligne!
Pour k> la longueur de chaîne fonctionne dans les fenêtres Octave 4.2.1 mais dans tio (Octave 4.0.3) ne fonctionne pas.
Crée des index numériques d'éléments consécutifs et indexe la chaîne par elle.
la source
05AB1E , 2 octets
Code:
Explication:
Utilise l' encodage 05AB1E .
Essayez-le en ligne!
la source
C (GCC sur POSIX),
676663 octets-3 octets grâce à @LeakyNun!
Essayez-le en ligne!
la source
j=0
.j+i<=strlen(s)
par justes[j+i]
Brachylog , 3 octets
Essayez-le en ligne!
Spécifications:
["ATCGAAGGTCGT",4]
Z
Z = ["ATCG","TCGA","CGAA","GAAG","AAGG","AGGT","GGTC","GTCG","TCGT"]
Comment ça marche
la source
Python 3 ,
47 4542 octets-3 octets grâce aux ovs (utilisez le déballage de Python 3 pour réutiliser
a[n-1:]
à la fin.)Une fonction récursive prenant la chaîne,
a
et la longueur de tranchen
, et renvoyant une liste des tranches ou une chaîne vide.a[n-1:]
prend une tranche de la chaîne actuelle à partir du n-1 ème élément (indexé 0) pour tester s'il reste suffisamment d'éléments (une chaîne vide est falsey en Python) - c'est plus court que l'équivalentlen(a)>=n
.S'il y a suffisamment d' éléments d' une liste est construite,
[...]
avec les premiersn
éléments de la chaîne,a[:n]
et le résultat décompressé d'appeler à nouveau la fonction,*f(...)
avec une version dequeued de l'entrée actuelle (sans le premier élément),a[1:]
.S'il n'y a pas assez d'éléments, la queue de la récursivité est atteinte quand
a[n-1:]
est retournée (dans ce cas une chaîne vide).Essayez-le en ligne!
45 pour Python 2 ou 3 avec:
la source
f=lambda a,n:a[n-1:]and[a[:n],*f(a[1:],n)]
pour 42 octets (Python 3) TIOJ , 2 octets
Ce n'est pas un programme complet, mais une fonction avec un opérateur.
Appelez-le comme tel:
Essayez-le en ligne!
Comment ça marche
L'opérateur (appelé "conjonction")
\
(nommé " infix ") est utilisé comme tel:La fonction (appelée "verbe")
u
dans ce cas est la fonction,
qui est une simple fonction " ajouter ":la source
Mathematica, 21 octets
Fonction anonyme. Prend une chaîne et un nombre (dans cet ordre) en entrée et renvoie une liste de chaînes en sortie.
la source
R,
6561 octets-2 octets grâce à MickyT
-2 octets en modifiant l'indexation
renvoie une fonction anonyme.
substring
fait défiler les indices (contrairement àsubstr
ce qui n'est pas le cas), et si l'indice de départ est inférieur à 1, il est par défaut1
place, il vérifie et renvoie la chaîne vide.x:n-n+1
est équivalent à1:(x-n+1)
puisque:
a priorité sur les sommes / différencesEssayez-le en ligne!
la source
function(s,n,x=nchar(s))
if(n>x,'',substring(s,1:(x-n+1),n:x))
Pyth , 2 octets
Ce n'est pas un programme complet, mais une fonction intégrée.
Appelez-le comme tel:
Essayez-le en ligne!
Programme complet:
Essayez-le en ligne!
(Le
.*
est splat.)la source
.:F
c'est un octet plus court pour le programme complet.Méduse , 7 octets
Essayez-le en ligne!
Comment ça marche
En linéaire:,
p(\(I,i))
oùp
est imprimé et\
obtient les sous-chaînes requises.I
est la première entrée brutei
la deuxième entrée évaluée.Dans Jellyfish, chaque fonction et opérateur reçoit deux arguments, l'un à droite et l'autre à partir du bas. Ici, la fonction
p
obtient l'argument de la sortie de_
, qui est nécessaire si nous voulons utiliser l'opérateur\
pour obtenir des sous-chaînes.la source
Python 2 , 54 octets
Essayez-le en ligne!
la source
Java (OpenJDK 8) , 92 octets
Essayez-le en ligne!
la source
String[]f(String s,int n){int i=0,t=s.length()-n+1;String[]r=new String[t];for(;i<t;r[i]=s.substring(i,n+i++));return r;}
Clojure, 19 octets
Eh bien c'est pratique:
Exemples:
la source
CJam , 4 octets
Bloc anonyme qui attend les arguments sur la pile et laisse le résultat sur la pile après.
Essayez-le en ligne!
ew
est un intégré qui fait exactement ce qui est nécessaire.la source
Rétine ,
4138 octetsEssayez-le en ligne!
Prend la chaîne et compte sur des lignes séparées. Les deux premières lignes sont utilisées pour convertir le nombre de décimales en unaire, donc si une entrée unaire est acceptable, le nombre d'octets sera réduit à
3431. Edit: 3 octets enregistrés grâce à @FryAmTheEggman. Ou, si vous préférez, une version de 48 octets qui gère les sauts de ligne dans la chaîne, bien que cela produise une sortie déroutante:la source
(?!)
à¶
.Octave avec paquet d'images, 29 octets
Essayez-le en ligne!
Explication
La fonction
im2col(m,b)
prend une matricem
, en extrait des blocs de tailleb
et les arrange en colonnes. Par défaut, les blocs glissent (par opposition à distincts). Ici, la matricem
est un vecteur ligne des codes ASCII de la chaîne d'entrées
(cela se fait comme+s
, ce qui est plus court que la normedouble(s)
), et la tailleb
est[1 n]
d'obtenir des blocs coulissants horizontalement den
éléments .Le résultat est transposé (en utilisant une transposition conjuguée complexe
'
, qui est plus courte que transposer.'
) pour transformer les colonnes en lignes, puis il est reconverti en char ([... '']
, qui est plus court que la normechar(...)
).la source
oK, 2 octets
oK a un opérateur de fenêtre coulissante !
la source
Python 3 , 49 octets
Essayez-le en ligne!
Une solution non récursive, quoique pas plus courte.
Compatible avec Python 2.
la source
f=
, en économisant deux octets, car vous ne l'utilisezf
nulle part ailleurs. Par défaut, les fonctions qui viennent d'être déclarées et non utilisées peuvent être laissées sans nom.PHP, 75 octets
Version en ligne
80 octets sans valeurs doubles
la source
Haskell, 39 octets
Exemple d'utilisation:
4 # "ABCDEF"
->["ABCD","BCDE","CDEF"]
. Essayez-le en ligne!Une récursivité simple qui conserve les premiers
n
caractères de la chaîne d'entrée et continue avec la queue de la chaîne tant que sa longueur n'est pas inférieure àn
.la source
Microsoft Sql Server, 199 octets
Vérifie ça.
la source
PowerShell, 70 octets
Essayez-le en ligne!
la source
Empilé , 7 octets
Essayez-le en ligne!
Assez standard. Sans cette fonction intégrée, elle devient 20 octets:
Lequel est:
la source
MATL , 3 octets
Essayez-le en ligne!
Explication
la source
C # 89 octets
Essayez-le en ligne!
La meilleure méthode que j'ai pu trouver en C # est fondamentalement la même que Java
la source
Rubis,
4846 octetsAucune astuce particulière, juste un stabby-lambda définissant une fonction qui tire la sous-chaîne requise de chaque point de départ valide.
Enregistrement de deux octets, car il ne semble pas nécessaire de stocker le lambda.
la source
V , 16 octets
Pas terriblement bien joué, je le crains, j'ai du mal à "supprimer la chaîne si k> len (str)". L'entrée est dans le fichier, k est un argument. Jouer au golf avant l'explication
Essayez-le en ligne!
la source
ML standard (mosml),
1096561 octetsPrend un nombre et une liste de caractères (une alternative assez courante aux chaînes dans le monde SML). (Fonctionne vraiment sur toutes les listes bien sûr.)
Usage:
Journal des modifications:
la source
if length(x)<n then
pourif n>length(x)then
. Cependant, comme il est parfaitement possible pour SML de gérer des chaînes, je ne suis pas sûr qu'il soit autorisé d'exiger d'explode
être déjà appliqué à la chaîne d'entrée.then nil else
Peut également être raccourcithen[]else
.fun f$n=if n>length$then[]else List.take($,n)::f(tl$)n
.JavaScript (Firefox 30-57), 51 octets
64 octets dans ES6:
la source