모든 k-mers / n-grams


21

소개

우리는 있었다 히스토그램계산을 하지만, 그들 모두를 나열하지.

매년 Dyalog Ltd. 는 학생 경쟁을 개최합니다. 좋은 APL 코드 를 작성 해야 합니다. 이것은 올해 여섯 번째 문제의 언어에 구애받지 않는 판입니다.

본인은 대회의 원저자로부터이 과제를 게시 할 수있는 명시적인 허가를 받았습니다. 제공된 링크 를 따르고 저자에게 연락하여 자유롭게 확인 하십시오.

문제

k-mer이라는 용어는 일반적으로 문자열에 포함 된 길이 k 의 가능한 모든 하위 문자열을 나타냅니다 . 전산 유전체학에서 k-mer은 DNA 시퀀싱을 통해 얻은 리드에서 가능한 모든 하위 시퀀스 (길이 k )를 나타냅니다. 문자열과 k (하위 문자열 길이)를 사용하여 원래 문자열의 k-mer 벡터를 반환 / 출력 하는 함수 / 프로그램을 작성하십시오 .

[4,"ATCGAAGGTCGT"]["ATCG","TCGA","CGAA","GAAG","AAGG","AGGT","GGTC","GTCG","TCGT"]

k > 문자열 길이? 아무것도 반환하지 않거나 빈 결과를 반환 :
[4,"AC"]→ 또는[]""[""]


4
출력 순서가 중요합니까? 하위 문자열이 여러 번 발생할 때 출력에서 ​​반복해야합니까?
feersum

1
내가 좋아하는 대신 문자열 배열의 줄 바꿈으로 구분하여 필요한 문자열의 문자열을 반환 할 수 ?
Leaky Nun

문자열을 문자 배열로 입력하고 출력 할 수도 있습니다 ( ? ['A', 'T', 'C', 'G']대신"ATCG"
Adnan

이 PPCG 챌린지에서 Dyalog APL 답변이 허용됩니까?
Kritixi Lithos

1
@feersum 주문이 중요하며 반복을 반복해야합니다. 이것은 슬라이딩 윈도우와 같습니다.
Adám

답변:



8

옥타브, 28 바이트

@(N,s)s((1:N)+(0:nnz(s)-N)')

온라인으로 사용해보십시오!

k> 문자열 길이의 경우 Octave 4.2.1-windows에서는 작동하지만 tio (Octave 4.0.3)에서는 작동하지 않습니다.

연속 요소의 숫자 색인을 작성하고 그에 의해 문자열을 색인화합니다.

s= "ATCGAAGGTCGT"
N = 4
idx = (1:N)+(0:nnz(s)-N)'
 =
    1    2    3    4
    2    3    4    5
    3    4    5    6
    4    5    6    7
    5    6    7    8
    6    7    8    9
    7    8    9   10
    8    9   10   11
    9   10   11   12

s(idx) =

ATCG
TCGA
CGAA
GAAG
AAGG
AGGT
GGTC
GTCG
TCGT


7

C (POSIX의 GCC), 67 66 63 바이트

@LeakyNun 덕분에 -3 바이트!

f(i,s,j)char*s;{for(;j+i<=strlen(s);puts(""))write(1,s+j++,i);}

온라인으로 사용해보십시오!


나는 당신이 필요하다고 생각하지 않습니다 j=0.
Leaky Nun

@LeakyNun 함수를 재사용 할 수 있어야합니다. 온라인으로 사용해보십시오! vs 온라인 사용해보십시오!
betseg

내가 이렇게하면 ...
betseg

1
당신은 대체 할 수있는 j+i<=strlen(s)단지로s[j+i]
Kritixi LITHOS에게

5

Brachylog , 3 바이트

s₎ᶠ

온라인으로 사용해보십시오!

명세서:

  • 입력: ["ATCGAAGGTCGT",4]
  • 논의: Z
  • 산출: Z = ["ATCG","TCGA","CGAA","GAAG","AAGG","AGGT","GGTC","GTCG","TCGT"]

작동 원리

s₎ᶠ
s    Output is a substring of first element of input,
 ₎   with length specified by second element of input.
  ᶠ  Find all solutions.

5

파이썬 3 ,  47 45 42 바이트

ovs 덕분에 -3 바이트 (파이썬 3의 압축 풀기를 사용 a[n-1:]하여 꼬리에서 재사용 )

f=lambda a,n:a[n-1:]and[a[:n],*f(a[1:],n)]

문자열, a슬라이스 길이 및을 사용하여 슬라이스 n목록 또는 빈 문자열을 반환하는 재귀 함수 입니다.

a[n-1:]n-1 번째 (0 인덱싱 된) 요소 에서 현재 문자열 조각을 가져 와서 충분한 요소가 남아 있는지 테스트합니다 (빈 문자열은 Python에서 거짓)-이것은 동등한 것보다 짧습니다 len(a)>=n.

  • 충분한 요소가있는 경우 , 문자열 [...]의 첫 번째 n요소 a[:n]및 함수를 다시 호출 한 압축 해제 된 결과 *f(...)와 함께 첫 번째 요소가없는 현재 입력의 대기열에서 제외 된 목록으로 목록이 구성 됩니다 a[1:].

  • 요소가 충분하지 않으면 a[n-1:]반환 될 때 재귀의 꼬리에 도달합니다 (이 경우 빈 문자열).

온라인으로 사용해보십시오!


Python 2 또는 3의 경우 45

f=lambda a,n:a[n-1:]and[a[:n]]+f(a[1:],n)or[]

f=lambda a,n:a[n-1:]and[a[:n],*f(a[1:],n)]42 바이트 (Python 3) TIO
ovs

@ovs, 아주 좋았습니다. 빈 결과는 문자열이고 비어 있지 않은 결과는 목록이므로 허용 가능한지 물었습니다.
Jonathan Allan

4

J , 2 바이트

,\

완전한 프로그램이 아니라 연산자가있는 기능입니다.

다음과 같이 호출하십시오.

echo 4 ,\ 'ATCGAAGGTCGT'

온라인으로 사용해보십시오!

작동 원리

연산자 ( "conjunction"이라고 함) \(이름이 " infix ")는 다음과 같이 사용됩니다.

(x u\ y)동사 u를 목록의 연속 부분에 적용 합니다 y(중위라고 함).

( "동사"라고 함) 기능 u이 경우는 함수 ,단순 "하다 APPEND "기능 :

의 항목을 포함하는 배열 생성 x의 항목을 하였다 y.


3

수학, 21 바이트

##~StringPartition~1&

익명의 기능. 문자열과 숫자 (순서대로)를 입력으로 받아서 문자열 목록을 출력으로 리턴합니다.


3

R, 65 61 바이트

MickyT 덕분에 -2 바이트

인덱싱을 변경하여 -2 바이트

익명 함수를 반환합니다.

function(s,n,x=nchar(s))`if`(n>x,'',substring(s,x:n-n+1,n:x))

substring인덱스를 순환하고 ( substr그렇지 않은 것과 달리 ) 시작 인덱스가 1보다 작은 경우 기본값이 1대신 기본값 이므로 빈 문자열을 확인하고 반환합니다.

x:n-n+1합 / 차보다 우선 하기 1:(x-n+1)때문에:

온라인으로 사용해보십시오!


function(s,n,x=nchar(s))if(n>x,'',substring(s,1:(x-n+1),n:x))
MickyT

@MickyT, 감사합니다! 또한 인덱스 계산을 변경하여 일부 바이트를 삭제할 수 있음을 알았습니다.
주세페


2

해파리 , 7 바이트

p
_I
\i

온라인으로 사용해보십시오!

작동 원리

선형 : p(\(I,i)), 여기서 p인쇄 및\ 필요한 하위 문자열을 가져옵니다.

I 첫 번째 입력은 i 평가 된 두 번째 입력입니다.

Jellyfish에서 모든 함수와 연산자는 오른쪽에서 하나, 아래쪽에서 하나의 두 가지 인수를받습니다. 여기서 함수 p는의 출력에서 ​​인수 를 가져옵니다. _연산자 \를 사용하여 하위 문자열을 가져 오는 경우에 필요합니다 .




2

클로저, 19 바이트

그럼 편리합니다 :

#(partition % 1 %2)

예 :

(def f #(partition % 1 %2))
(println [(f 4 "ATCGAAGGTCGT")
          (f 4 "abc")])

[((A T C G) (T C G A) (C G A A) (G A A G) (A A G G) (A G G T) (G G T C) (G T C G) (T C G T))
 ()]


2

망막 , 41 38 바이트

.*$
$*
!&`(.)+(?=.*¶(?<-1>.)+(?(1)¶)$)

온라인으로 사용해보십시오!

문자열을 가져 와서 별도의 줄에 넣습니다. 처음 두 줄은 카운트를 10 진수에서 단항으로 변환하는 데 사용되므로 단항 입력이 허용되는 경우 바이트 수가 34 31 로 줄어 듭니다 . 편집 : @FryAmTheEggman 덕분에 3 바이트가 저장되었습니다. 또는 원하는 경우 문자열의 줄 바꿈을 처리하는 48 바이트 버전으로 혼동되는 출력이 생성됩니다.

.*$
$*
!&`(\S|\s)+(?=[\S\s]*¶(?<-1>.)+(?(1)$.)$)

@KritixiLithos 귀하의 솔루션이 어떻게 카운트를 고려하는지 모르겠습니다 ...
Neil

아, 미안 난 그냥 뇌 방귀했다> _ <
Kritixi LITHOS

문자열은 줄 바꿈을 포함 할 수 있는지를 변경할 수 있다고 생각 있도록이 반드시 작동하지 않습니다 (?!).
FryAmTheEggman

2

이미지 패키지가있는 옥타브 , 29 바이트

@(s,n)[im2col(+s, [1 n])' '']

온라인으로 사용해보십시오!

설명

이 함수 im2col(m,b)는 행렬을 가져와 m크기 블록을 추출 b하여 열로 정렬합니다. 기본적으로 블록은 서로 다릅니다 (개별이 아님). 여기서 행렬 m은 입력 문자열의 ASCII 코드로 구성된 행 벡터이며 s(이것은 +s표준보다 짧은 으로 수행됨 double(s)) 크기 b는 요소의 [1 n]가로 슬라이딩 블록을 얻는 것 n입니다.

결과는 전치 '보다 짧은 복합 결합 전치를 사용하여 전치 .'되며 열을 행으로 변환 한 다음 다시 char ( [... '']표준보다 짧은 )로 변환됩니다 char(...).



1

파이썬 3 , 49 바이트

f=lambda a,n:[a[i:i+n]for i in range(len(a)-n+1)]

온라인으로 사용해보십시오!

짧지는 않지만 비 재귀 솔루션입니다.

Python 2와 호환됩니다.


다른 곳에서는 f=사용하지 않기 때문에 2 바이트를 절약하여 삭제할 수 있습니다 f. 기본적으로 방금 선언되어 사용되지 않은 함수의 이름은 그대로 둘 수 있습니다.
Mr. Xcoder

1

PHP, 75 바이트

온라인 버전

for([,$n,$s]=$argv;$i+$n-1<strlen($s);)$r[]=substr($s,$i++,$n);print_r($r);

이중 값이없는 80 바이트

for([,$n,$s]=$argv;$i+$n-1<strlen($s);)$r[$p=substr($s,$i++,$n)]=$p;print_r($r);

1

하스켈, 39 바이트

n#s|length s<n=[]|1<2=take n s:n#tail s

사용 예 : 4 # "ABCDEF"-> ["ABCD","BCDE","CDEF"]. 온라인으로 사용해보십시오!

n입력 문자열 의 첫 번째 문자 를 유지하는 간단한 재귀 는 길이가 최소 길이 인 한 문자열의 꼬리를 계속합니다 n.


1

Microsoft Sql Server, 199 바이트

create function dbo.f(@s nvarchar(max),@ int)returns table as return
with v as(select 2 p,left(@s,@)g where len(@s)>=@ union all
select p+1,substring(@s,p,@)from v where len(@s)>p-2+@)select g from v

확인해 봐.



1

스택 형 , 7 바이트

infixes

온라인으로 사용해보십시오!

꽤 표준입니다. 이 내장이 없으면 20 바이트가됩니다.

{%x#'y-#+:>y#-#>x\#}

어느 것이 :

{%x#'y-#+:>y#-#>x\#}
{%                 }   dyad; first arg: x, second arg: y
  x#'                  length of x (the array)
     y-                minus y (the skew)
       #+              plus 1
         :>            range [x, y]
           y#-         y minus 1
              #>       range from [[x, y], [x, y] + y]
                x\#    get indices from x



1

루비, 48 46 바이트

->(s,k){0.upto(s.size-k).map{|i|s[i..i+k-1]}}

특별한 트릭은 없으며 각 유효한 시작점에서 필요한 하위 문자열을 가져 오는 함수를 정의하는 스테이 비 람다입니다.

람다를 저장할 필요가 없기 때문에 2 바이트를 절약했습니다.


1

V , 16 바이트

òÀ|ly0Ïp
"_xòkVp

굉장히 골프를 잘하지 못합니다. "k> len (str)면 문자열 삭제"로 어려움을 겪고 있습니다. 입력은 파일에 있고 k는 인수입니다. 설명하기 전에 골프

온라인으로 사용해보십시오!


k> len (str) 케이스를 처리하지 않으면 어떻게됩니까?
Adám

내가 사용하는 방법 (특히이 방법)에 따라 문자열을 그대로 둡니다.
nmjcman101

1

표준 ML (mosml), 109 65 61 바이트

fun f(n,x)=if n>length(x)then[]else List.take(x,n)::f(n,tl x)

숫자와 문자 목록을 가져옵니다 (SML 세계의 문자열에 대한 일반적인 대안). (정말로 모든 코스 목록에서 작동합니다.)

용법:

- f(3,explode("ABCDEFGH"));
> val it =
    [[#"A", #"B", #"C"], [#"B", #"C", #"D"], [#"C", #"D", #"E"],
     [#"D", #"E", #"F"], [#"E", #"F", #"G"], [#"F", #"G", #"H"]] :
  char list list
- f(7, explode("ABCD"));
> val it = [] : char list list

변경 로그:

  • 표준 라이브러리가 있습니다. (-44 바이트)
  • 제안 된대로 비교 및 ​​nil을 [] (-4 바이트)로 변경

1
로 변경 if length(x)<n then하여 바이트를 저장할 수 있습니다 if n>length(x)then. 그러나 SML이 문자열을 처리하는 것이 완벽 explode하기 때문에 입력 문자열에 이미 적용되어 있는지 확실하지 않습니다 .
Laikoni

또한 then nil else단축 할 수있다 then[]else.
Laikoni

@Laikoni도 확실하지 않지만 ¯ \ _ (ツ) _ / ¯
L3viathan

다른 라이브러리 함수를 사용하면 char 목록 대신 문자열을 처리 하는 68 바이트 버전 이 있습니다. 또한 접근 방식을 54 바이트로 단축 할 수 있습니다 fun f$n=if n>length$then[]else List.take($,n)::f(tl$)n.
Laikoni

1

자바 스크립트 (Firefox 30-57), 51 바이트

(s,n,t='')=>[for(c of s)if((t+=c)[n-1])t.slice(-n)]

ES6에서 64 바이트 :

(s,n,t=s.slice(0,--n))=>[...s.slice(n)].map(c=>(t+=c).slice(~n))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.