Introducción
Hemos tenido histogramas y contando , pero no los hemos enumerado todos.
Cada año, Dyalog Ltd. celebra una competencia estudiantil. El desafío es escribir un buen código APL. Esta es una edición de código de golf independiente del sexto problema de este año.
Tengo permiso explícito para publicar este desafío aquí del autor original de la competencia. No dude en verificar siguiendo el enlace proporcionado y contactando al autor.
Problema
El término k-mer generalmente se refiere a todas las posibles subcadenas de longitud k que están contenidas en una cadena. En genómica computacional, los k-mers se refieren a todas las subsecuencias posibles (de longitud k ) de una lectura obtenida a través de la secuenciación de ADN. Escriba una función / programa que tome una cadena yk (la longitud de la subcadena) y devuelva / genere un vector de los k-mers de la cadena original.
Ejemplos
[4,"ATCGAAGGTCGT"]
→ ["ATCG","TCGA","CGAA","GAAG","AAGG","AGGT","GGTC","GTCG","TCGT"]
k > longitud de la cuerda? No devuelve nada / ningún resultado vacío:
[4,"AC"]
→ []
o ""
o[""]
['A', 'T', 'C', 'G']
lugar de"ATCG"
?Respuestas:
Gelatina , 1 byte
Jelly tiene un átomo diádico de un solo byte para esta misma operación
Pruébalo en línea! (el pie de página divide la lista resultante con nuevas líneas, para evitar que se imprima una representación borrosa).
fuente
Octava, 28 bytes
Pruébalo en línea!
Para k> la longitud de la cadena funciona en Octave 4.2.1-windows pero en tio (Octave 4.0.3) no funciona.
Crea índices numéricos de elementos consecutivos e indexa la cadena por él.
fuente
05AB1E , 2 bytes
Código:
Explicación:
Utiliza la codificación 05AB1E .
Pruébalo en línea!
fuente
C (GCC en POSIX),
676663 bytes-3 bytes gracias a @LeakyNun!
Pruébalo en línea!
fuente
j=0
.j+i<=strlen(s)
con solos[j+i]
Brachylog , 3 bytes
Pruébalo en línea!
Especificaciones:
["ATCGAAGGTCGT",4]
Z
Z = ["ATCG","TCGA","CGAA","GAAG","AAGG","AGGT","GGTC","GTCG","TCGT"]
Cómo funciona
fuente
Python 3 ,
47 4542 bytes-3 bytes gracias a los ovs (use el desempaquetado de Python 3 para reutilizar
a[n-1:]
en la cola).Una función recursiva que toma la cadena,
a
y la longitud de la porciónn
, y devuelve una lista de las rebanadas o una cadena vacía.a[n-1:]
toma una rebanada de la cadena actual de la n-1 ésimo (0 indexados) elemento hacia adelante a prueba si hay elementos suficientes restante (una cadena vacía es Falsey en Python) - esto es más corto que el equivalentelen(a)>=n
.Si hay suficientes elementos, se construye una lista
[...]
, con los primerosn
elementos de la cadena,a[:n]
y el resultado desempaquetado de llamada de la función,*f(...)
con una versión quitado de la cola de la entrada actual (sin el primer elemento),a[1:]
.Si no hay suficientes elementos, se alcanza la cola de la recursividad cuando
a[n-1:]
se devuelve (en este caso, una cadena vacía).Pruébalo en línea!
45 para Python 2 o 3 con:
fuente
f=lambda a,n:a[n-1:]and[a[:n],*f(a[1:],n)]
para 42 bytes (Python 3) TIOJ , 2 bytes
No es un programa completo, sino una función con un operador.
Llámalo como tal:
Pruébalo en línea!
Cómo funciona
El operador (llamado "conjunción")
\
(llamado " infijo ") se usa como tal:La función (llamada "verbo")
u
en este caso es la función,
que es una simple función " agregar ":fuente
Mathematica, 21 bytes
Función anónima. Toma una cadena y un número (en ese orden) como entrada y devuelve una lista de cadenas como salida.
fuente
R,
6561 bytes-2 bytes gracias a MickyT
-2 bytes cambiando la indexación
devuelve una función anónima
substring
realiza un ciclo a través de los índices (a diferencia de lossubstr
que no lo hacen), y si el índice inicial es menor que 1, su valor predeterminado es1
, por lo tanto, comprueba y devuelve la cadena vacía.x:n-n+1
es equivalente a1:(x-n+1)
ya que:
tiene prioridad sobre sumas / diferenciasPruébalo en línea!
fuente
function(s,n,x=nchar(s))
if(n>x,'',substring(s,1:(x-n+1),n:x))
Pyth , 2 bytes
No es un programa completo, sino una función incorporada.
Llámalo como tal:
Pruébalo en línea!
Programa completo:
Pruébalo en línea!
(El
.*
es splat.)fuente
.:F
es un byte más corto para el programa completo.Medusa , 7 bytes
Pruébalo en línea!
Cómo funciona
En lineal:,
p(\(I,i))
dondep
se imprime y\
obtiene las subcadenas requeridas.I
es la primera entrada sin procesar mientras quei
es la segunda entrada evaluada.En Jellyfish, cada función y operador obtiene dos argumentos, uno desde la derecha y otro desde la parte inferior. Aquí, la función
p
obtiene el argumento de la salida de_
, que es necesaria si vamos a usar el operador\
para obtener subcadenas.fuente
Python 2 , 54 bytes
Pruébalo en línea!
fuente
Java (OpenJDK 8) , 92 bytes
Pruébalo en línea!
fuente
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 bytes
Bueno, esto es útil:
Ejemplos:
fuente
CJam , 4 bytes
Bloque anónimo que espera los argumentos en la pila y deja el resultado en la pila después.
Pruébalo en línea!
ew
es una función integrada que hace exactamente lo que se requiere.fuente
Retina ,
4138 bytesPruébalo en línea!
Toma la cuerda y cuenta con líneas separadas. Las dos primeras líneas se utilizan para convertir el recuento de decimal a unario, por lo que si la entrada unaria es aceptable, el recuento de bytes se reducirá a
3431. Editar: Guardado 3 bytes gracias a @FryAmTheEggman. O, si lo prefiere, una versión de 48 bytes que maneja nuevas líneas en la cadena, aunque eso produce resultados confusos:fuente
(?!)
a¶
.Octava con paquete de imágenes, 29 bytes
Pruébalo en línea!
Explicación
La función
im2col(m,b)
toma una matrizm
, extrae bloques de tamañob
de ella y los organiza como columnas. Por defecto, los bloques son deslizantes (en oposición a distintos). Aquí la matrizm
es un vector de fila de los códigos ASCII de la cadena de entradas
(esto se hace como+s
, que es más corto que el estándardouble(s)
), y el tamañob
es[1 n]
para obtener bloques den
elementos deslizantes horizontalmente .El resultado se transpone (usando la transposición de conjugado complejo
'
, que es más corta que la transposición.'
) para convertir las columnas en filas, y luego se convierte de nuevo en char ([... '']
que es más corto que el estándarchar(...)
).fuente
ok, 2 bytes
¡OK tiene un operador de ventana deslizante !
fuente
Python 3 , 49 bytes
Pruébalo en línea!
Una solución no recursiva, aunque no más corta.
Compatible con Python 2.
fuente
f=
, ahorrando dos bytes, porque no los usa enf
ningún otro lugar. Por defecto, las funciones que se declaran y no se pueden usar pueden dejarse sin nombre.PHP, 75 bytes
Versión en línea
80 bytes sin valores dobles
fuente
Haskell, 39 bytes
Ejemplo de uso:
4 # "ABCDEF"
->["ABCD","BCDE","CDEF"]
.Pruébalo en línea!Una recursión simple que mantiene los primeros
n
caracteres de la cadena de entrada y continúa con la cola de la cadena siempre que su longitud no sea menor quen
.fuente
Servidor SQL de Microsoft, 199 bytes
Revisalo.
fuente
PowerShell, 70 bytes
Pruébalo en línea!
fuente
Apilado , 7 bytes
Pruébalo en línea!
Bastante estándar Sin este incorporado, se convierte en 20 bytes:
Cual es:
fuente
MATL , 3 bytes
Pruébalo en línea!
Explicación
fuente
C # 89 bytes
Pruébalo en línea!
El mejor método que pude encontrar en C # es básicamente el mismo que Java
fuente
Ruby,
4846 bytesNo hay trucos particulares, solo un stabby-lambda que define una función que extrae la subcadena requerida de cada punto de partida válido.
Se guardaron dos bytes, ya que no parece ser necesario almacenar el lambda.
fuente
V , 16 bytes
Me temo que no está muy bien golfizado, luchando con "eliminar la cadena si k> len (str)". La entrada está en el archivo, k es un argumento. Golf antes de la explicación
Pruébalo en línea!
fuente
ML estándar (mosml),
1096561 bytesToma un número y una lista de caracteres (una alternativa bastante común a las cadenas en el mundo SML). (Realmente funciona en todas las listas, por supuesto).
Uso:
Registro de cambios:
fuente
if length(x)<n then
aif n>length(x)then
. Sin embargo, como es perfectamente posible que SML maneje cadenas, no estoy seguro de que se requieraexplode
que ya se aplique a la cadena de entrada.then nil else
se puede acortar athen[]else
.fun f$n=if n>length$then[]else List.take($,n)::f(tl$)n
.JavaScript (Firefox 30-57), 51 bytes
64 bytes en ES6:
fuente