Introdução
Tivemos histogramas e contando , mas não listamos todos eles.
Todos os anos, a Dyalog Ltd. realiza uma competição estudantil. O desafio é escrever um bom código APL. Esta é uma edição de código-golfe independente de idioma do sexto problema deste ano.
Tenho permissão explícita para postar esse desafio aqui, do autor original da competição. Sinta-se livre para verificar, seguindo o link fornecido e entrando em contato com o autor.
Problema
O termo k-mer geralmente se refere a todas as substrings possíveis de comprimento k que estão contidas em uma sequência. Na genômica computacional, k-mers se referem a todas as subsequências possíveis (de comprimento k ) de uma leitura obtida por meio do seqüenciamento de DNA. Escreva uma função / programa que use uma string ek (o comprimento da substring) e retorne / produza um vetor dos k-mers da string original.
Exemplos
[4,"ATCGAAGGTCGT"]
→ ["ATCG","TCGA","CGAA","GAAG","AAGG","AGGT","GGTC","GTCG","TCGT"]
k > comprimento da corda? Retornar nada / nenhum resultado vazio:
[4,"AC"]
→ []
ou ""
ou[""]
['A', 'T', 'C', 'G']
em vez de"ATCG"
?Respostas:
Geléia , 1 byte
A geléia possui um átomo diádico de byte único para esta operação
Experimente online! (o rodapé divide a lista resultante com novas linhas, para evitar que uma representação reduzida seja impressa.)
fonte
Oitava, 28 bytes
Experimente online!
Para k> o comprimento da string funciona no Octave 4.2.1-windows, mas no tio (Octave 4.0.3) não funciona.
Cria índices numéricos de elementos consecutivos e indexa a string por ela.
fonte
05AB1E , 2 bytes
Código:
Explicação:
Usa a codificação 05AB1E .
Experimente online!
fonte
C (GCC no POSIX),
676663 bytes-3 bytes graças a @LeakyNun!
Experimente online!
fonte
j=0
.j+i<=strlen(s)
por apenass[j+i]
Braquilog , 3 bytes
Experimente online!
Especificações:
["ATCGAAGGTCGT",4]
Z
Z = ["ATCG","TCGA","CGAA","GAAG","AAGG","AGGT","GGTC","GTCG","TCGT"]
Como funciona
fonte
Python 3 ,
47 4542 bytes-3 bytes graças ao ovs (use a descompactação do Python 3 para reutilizar
a[n-1:]
na cauda.)Uma função recursiva que pega a sequência,
a
e o comprimento da fatian
, e retorna uma lista das fatias ou de uma sequência vazia.a[n-1:]
pega uma fatia da string atual do n- ésimo elemento (indexado a 0) para testar se ainda há elementos suficientes (uma string vazia é falsey no Python) - isso é mais curto que o equivalentelen(a)>=n
.Se houver elementos suficientes, uma lista será construída,
[...]
com os primeirosn
elementos da sequência,a[:n]
e o resultado descompactado da chamada da função novamente*f(...)
, com uma versão em fila da entrada atual (sem o primeiro elemento),a[1:]
,.Se não houver elementos suficientes, a cauda da recursão é alcançada quando
a[n-1:]
é retornada (neste caso, uma sequência vazia).Experimente online!
45 para Python 2 ou 3 com:
fonte
f=lambda a,n:a[n-1:]and[a[:n],*f(a[1:],n)]
para 42 bytes (Python 3) TIOJ , 2 bytes
Não é um programa completo, mas uma função com um operador.
Chame assim:
Experimente online!
Como funciona
O operador (chamado "conjunção")
\
(denominado " infix ") é usado como tal:A função (chamada "verbo")
u
nesse caso é a função,
que é uma função simples " anexar ":fonte
Mathematica, 21 bytes
Função anônima. Pega uma string e um número (nessa ordem) como entrada e retorna uma lista de strings como saída.
fonte
R,
65bytes 61-2 bytes graças ao MickyT
-2 bytes alterando a indexação
retorna uma função anônima.
substring
alterna entre os índices (ao contrário dossubstr
que não o fazem) e, se o índice inicial for menor que 1, o padrão será1
, portanto, verifica e retorna a sequência vazia.x:n-n+1
é equivalente a1:(x-n+1)
uma vez que:
tem precedência sobre somas / diferençasExperimente online!
fonte
function(s,n,x=nchar(s))
if(n>x,'',substring(s,1:(x-n+1),n:x))
Pitão , 2 bytes
Não é um programa completo, mas uma função interna.
Chame assim:
Experimente online!
Programa completo:
Experimente online!
(O
.*
é splat.)fonte
.:F
é um byte mais curto para o programa completo.Água-viva , 7 bytes
Experimente online!
Como funciona
Em linear:,
p(\(I,i))
ondep
é impresso e\
obtém as substrings necessárias.I
é a primeira entrada bruta enquantoi
é a segunda entrada avaliada.No Jellyfish, cada função e operador recebe dois argumentos, um da direita e outro da parte inferior. Aqui, a função
p
obtém o argumento da saída de_
, que é necessária se quisermos usar o operador\
para obter substrings.fonte
Python 2 , 54 bytes
Experimente online!
fonte
Java (OpenJDK 8) , 92 bytes
Experimente online!
fonte
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
Bem, isso é útil:
Exemplos:
fonte
CJam , 4 bytes
Bloco anônimo que espera os argumentos na pilha e deixa o resultado na pilha depois.
Experimente online!
ew
é um built-in que faz exatamente o que é necessário.fonte
Retina ,
4138 bytesExperimente online!
Pega a corda e conta em linhas separadas. As duas primeiras linhas são usadas para converter a contagem de decimal para unária; portanto, se a entrada unária for aceitável, a contagem de bytes será reduzida para
3431. Edit: Salvo 3 bytes graças a @FryAmTheEggman. Ou, se preferir, uma versão de 48 bytes que lida com novas linhas na string, embora isso produza resultados confusos:fonte
(?!)
para¶
.Oitava com pacote de imagens, 29 bytes
Experimente online!
Explicação
A função
im2col(m,b)
pega uma matrizm
, extrai blocos de tamanhob
dela e os organiza como colunas. Por padrão, os blocos são deslizantes (em oposição a distintos). Aqui a matrizm
é um vetor de linha dos códigos ASCII da sequência de entradas
(isso é feito como+s
, que é mais curto que o padrãodouble(s)
), e o tamanhob
é[1 n]
obter blocos deslizantes horizontalmente den
elementos .O resultado é transposto (usando a transposição conjugada complexa
'
, que é mais curta que a transposta.'
) para transformar as colunas em linhas e depois é convertida novamente em char ([... '']
que é mais curto que o padrãochar(...)
).fonte
OK, 2 bytes
oK tem um operador de janela deslizante !
fonte
Python 3 , 49 bytes
Experimente online!
Uma solução não recursiva, embora não menor.
Compatível com Python 2.
fonte
f=
, salvando dois bytes, porque você não usa emf
nenhum outro lugar. Por padrão, as funções que acabam de ser declaradas e não usadas podem ser deixadas sem nome.PHP, 75 bytes
Versão Online
80 bytes sem valores duplos
fonte
Haskell, 39 bytes
Exemplo de uso:
4 # "ABCDEF"
->["ABCD","BCDE","CDEF"]
. Experimente online!Uma recursão simples que mantém os primeiros
n
caracteres da string de entrada e continua com a cauda da string desde que seu comprimento não seja menor quen
.fonte
Microsoft Sql Server, 199 bytes
Verifique-o.
fonte
PowerShell, 70 bytes
Experimente online!
fonte
Empilhados , 7 bytes
Experimente online!
Bastante padrão. Sem esse built-in, ele se torna 20 bytes:
Qual é:
fonte
MATL , 3 bytes
Experimente online!
Explicação
fonte
Bytes C # 89
Experimente online!
O melhor método que eu poderia encontrar em C # é basicamente o mesmo que Java
fonte
Ruby,
4846 bytesNão há truques específicos, apenas um stabby-lambda que define uma função que extrai a substring necessária de cada ponto de partida válido.
Salva dois bytes, já que não parece haver necessidade de armazenar o lambda.
fonte
V , 16 bytes
Receio que não seja muito bem jogado, lutando com "exclua a string se k> len (str)". A entrada está no arquivo, k é um argumento. Golfe antes da explicação
Experimente online!
fonte
ML padrão (mosml),
1096561 bytesLeva um número e uma lista de caracteres (uma alternativa bastante comum para seqüências de caracteres no mundo SML). (Realmente funciona em todas as listas, é claro.)
Uso:
Changelog:
fonte
if length(x)<n then
paraif n>length(x)then
. No entanto, como é perfeitamente possível para o SML manipular seqüências de caracteres, não tenho certeza se é permitido queexplode
ele já seja aplicado à sequência de entrada.then nil else
pode ser reduzido parathen[]else
.fun f$n=if n>length$then[]else List.take($,n)::f(tl$)n
.JavaScript (Firefox 30-57), 51 bytes
64 bytes no ES6:
fonte