Tất cả các kers / n-gram


21

Giới thiệu

Chúng tôi đã có biểu đồđếm , nhưng không liệt kê tất cả chúng.

Hàng năm, Dyalog Ltd. tổ chức một cuộc thi sinh viên. Thách thức ở đây là viết mã APL tốt . Đây là một phiên bản bất khả tri ngôn ngữ của vấn đề thứ sáu trong năm nay.

Tôi có sự cho phép rõ ràng để đăng thử thách này ở đây từ tác giả ban đầu của cuộc thi. Vui lòng xác minh bằng cách theo liên kết được cung cấp và liên hệ với tác giả.

Vấn đề

Thuật ngữ k-mer thường dùng để chỉ tất cả các chuỗi con có thể có độ dài k được chứa trong một chuỗi. Trong bộ gen tính toán, k-mers đề cập đến tất cả các chuỗi con có thể (có độ dài k ) từ một lần đọc thu được thông qua Trình tự DNA. Viết hàm / chương trình lấy một chuỗi và k (độ dài chuỗi con) và trả về / xuất ra một vectơ của k-mers của chuỗi gốc.

Ví dụ

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

k > độ dài chuỗi? Trả lại không có gì / bất kỳ kết quả trống nào:
[4,"AC"][]hoặc ""hoặc[""]


4
Liệu thứ tự của đầu ra có vấn đề? Khi một chuỗi con xảy ra nhiều lần, nó có nên được lặp lại trong đầu ra không?
frageum

1
Tôi có thể trả về một chuỗi các chuỗi con cần thiết được phân tách bằng các dòng mới thay vì một chuỗi các chuỗi như thế này không?
Leaky Nun

Chúng ta cũng có thể nhập và xuất chuỗi dưới dạng một mảng các ký tự (như ['A', 'T', 'C', 'G']thay vì "ATCG"?
Adnan

Các câu trả lời APL của Dyalog có được phép trong thử thách PPCG này không (vì thử thách này cũng được Dyalog tổ chức)?
Kritixi Lithos

1
@feersum Vấn đề đặt hàng, và sự lặp lại nên được lặp lại. Điều này giống như một cửa sổ trượt.
Adám

Câu trả lời:



8

Octave, 28 byte

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

Hãy thử trực tuyến!

Đối với k> độ dài chuỗi hoạt động trong Octave 4.2.1-windows nhưng trong tio (Octave 4.0.3) không hoạt động.

Tạo các chỉ mục số của các phần tử liên tiếp và lập chỉ mục chuỗi theo nó.

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



5

Brachylog , 3 byte

s₎ᶠ

Hãy thử trực tuyến!

Thông số kỹ thuật:

  • Đầu vào: ["ATCGAAGGTCGT",4]
  • Tranh luận: Z
  • Đầu ra: Z = ["ATCG","TCGA","CGAA","GAAG","AAGG","AGGT","GGTC","GTCG","TCGT"]

Làm thế nào nó hoạt động

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

5

Python 3 ,  47 45 42 byte

-3 byte nhờ các ovs (sử dụng giải nén Python 3 để sử dụng lại a[n-1:]ở đuôi.)

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

Hàm đệ quy lấy chuỗi avà độ dài lát nvà trả về danh sách các lát hoặc chuỗi rỗng.

a[n-1:]mất một lát chuỗi hiện tại từ n-1 thứ (0-lập chỉ mục) yếu tố trở đi để kiểm tra xem có đủ các yếu tố còn lại (một chuỗi rỗng là falsey bằng Python) - đây là ngắn hơn tương đương len(a)>=n.

  • Nếu có đủ các phần tử, một danh sách được xây dựng, [...]với các nphần tử đầu tiên của chuỗi a[:n]và kết quả được giải nén của việc gọi lại hàm *f(...), với phiên bản đầu vào hiện tại (không có phần tử đầu tiên) , a[1:].

  • Nếu không có đủ phần tử, phần đuôi của đệ quy sẽ đạt được khi a[n-1:]được trả về (trong trường hợp này là một chuỗi rỗng).

Hãy thử trực tuyến!


45 cho Python 2 hoặc 3 với:

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)]cho 42 byte (Python 3) TIO
ovs

@ovs, rất hay, tôi đã hỏi liệu điều này có được chấp nhận không (vì kết quả trống của chúng là một chuỗi, trong khi kết quả không trống là một danh sách).
Jonathan Allan

4

J , 2 byte

,\

Nó không phải là một chương trình hoàn chỉnh, mà là một chức năng với một toán tử.

Gọi nó như vậy:

echo 4 ,\ 'ATCGAAGGTCGT'

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Toán tử (được gọi là "kết hợp") \(được đặt tên là " infix ") được sử dụng như sau:

(x u\ y)áp dụng động từ ucho các phần tiếp theo của danh sách y(được gọi là infixes).

Hàm (được gọi là "động từ") utrong trường hợp này là hàm ,là hàm " chắp thêm " đơn giản :

Tạo một mảng chứa các mục xtheo sau bởi các mục của y.


3

Toán học, 21 byte

##~StringPartition~1&

Chức năng ẩn danh. Lấy một chuỗi và một số (theo thứ tự đó) làm đầu vào và trả về một danh sách các chuỗi làm đầu ra.


3

R, 65 61 byte

-2 byte nhờ MickyT

-2 byte bằng cách thay đổi chỉ mục

trả về một hàm ẩn danh.

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

substringquay vòng qua các chỉ số (trái ngược với chỉ số substrnào không) và nếu chỉ số bắt đầu nhỏ hơn 1, nó sẽ mặc định 1thay vào đó, vì vậy nó sẽ kiểm tra và trả về chuỗi trống.

x:n-n+1tương đương với 1:(x-n+1)từ :được ưu tiên hơn tiền / khác biệt

Hãy thử trực tuyến!


bạn có thể lưu một vài byte với function(s,n,x=nchar(s))nếu(n>x,'',substring(s,1:(x-n+1),n:x))
MickyT

@MickyT, cảm ơn! Tôi cũng nhận thấy rằng tôi có thể giảm một số byte bằng cách thay đổi tính toán chỉ mục
Giuseppe


2

Sứa , 7 byte

p
_I
\i

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Trong tuyến tính : p(\(I,i)), nơi pđược in và \nhận các chuỗi con cần thiết.

Ilà đầu vào đầu tiên thô trong khi ilà đầu vào thứ hai được đánh giá.

Trong Jellyfish, mọi hàm và toán tử đều có hai đối số, một từ bên phải và một từ phía dưới. Ở đây, hàm plấy đối số từ đầu ra của _, điều này là bắt buộc nếu chúng ta sử dụng toán tử \để lấy chuỗi con.




2

Clojure, 19 byte

Vâng, điều này là tiện dụng:

#(partition % 1 %2)

Ví dụ:

(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

CJam , 4 byte

{ew}

Khối ẩn danh dự kiến ​​các đối số trên ngăn xếp và để lại kết quả trên ngăn xếp sau.

Hãy thử trực tuyến!

ew là một tích hợp thực hiện chính xác những gì được yêu cầu.


5
Tôi chỉ có một điều để nói: ew
Adám

2

Võng mạc , 41 38 byte

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

Hãy thử trực tuyến!

Lấy chuỗi và đếm trên các dòng riêng biệt. Hai dòng đầu tiên được sử dụng để chuyển đổi số đếm từ số thập phân sang đơn vị, vì vậy nếu đầu vào đơn nguyên được chấp nhận thì số byte sẽ giảm xuống còn 34 31. Chỉnh sửa: Đã lưu 3 byte nhờ @FryAmTheEggman. Hoặc, nếu bạn thích, một phiên bản 48 byte xử lý các dòng mới trong chuỗi, mặc dù điều đó tạo ra đầu ra khó hiểu:

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

@KritixiLithos Tôi không thấy cách giải pháp của bạn được tính đến ...
Neil

Ôi, xin lỗi, tôi vừa bị rắm não> _ <
Kritixi Lithos

Điều này không nhất thiết phải hoạt động nếu chuỗi có thể chứa một dòng mới, vì vậy tôi nghĩ bạn có thể thay đổi (?!)thành .
FryAmTheEggman

2

Octave với gói hình ảnh, 29 byte

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

Hãy thử trực tuyến!

Giải trình

Hàm im2col(m,b)lấy một ma trận m, trích xuất các khối có kích thước btừ nó và sắp xếp chúng thành các cột. Theo mặc định, các khối được trượt (trái ngược với phân biệt). Ở đây, ma trận mlà một vectơ hàng của mã ASCII của chuỗi đầu vào s(điều này được thực hiện dưới dạng +sngắn hơn tiêu chuẩn double(s)) và kích thước b[1 n]để có được các khối nphần tử trượt theo chiều ngang .

Kết quả được hoán vị (sử dụng chuyển vị liên hợp phức tạp ', ngắn hơn chuyển vị .') để biến các cột thành hàng, và sau đó nó được chuyển đổi trở lại thành char ( [... '']ngắn hơn tiêu chuẩn char(...)).



1

Python 3 , 49 byte

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

Hãy thử trực tuyến!

Một giải pháp không đệ quy, mặc dù không ngắn hơn.

Tương thích với Python 2.


Bạn có thể thả f=, lưu hai byte, vì bạn không sử dụng fbất cứ nơi nào khác. Theo mặc định, các chức năng chỉ được khai báo và không được sử dụng có thể được bỏ tên.
Ông Xcoder

1

PHP, 75 byte

Phiên bản trực tuyến

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

80 byte không có giá trị kép

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

1

Haskell, 39 byte

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

Ví dụ sử dụng: 4 # "ABCDEF"-> ["ABCD","BCDE","CDEF"]. Hãy thử trực tuyến!

Một đệ quy đơn giản giữ cho các nký tự đầu tiên của chuỗi đầu vào tiếp tục với đuôi của chuỗi miễn là độ dài của nó không nhỏ hơn n.


1

Máy chủ Microsoft Sql, 199 byte

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

Kiểm tra nó.



1

Xếp chồng lên nhau , 7 byte

infixes

Hãy thử trực tuyến!

Khá chuẩn. Không có nội dung này, nó trở thành 20 byte:

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

Đó là:

{%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

C # 89 byte

void a(string s,int n){for(int i=n;i<=s.Length;)Console.WriteLine(s.Substring(i++-n,n));}

Hãy thử trực tuyến!

Phương pháp tốt nhất tôi có thể tìm thấy trong C # về cơ bản giống như Java


1

Ruby, 48 46 byte

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

Không có thủ thuật cụ thể nào, chỉ là một stabby-lambda xác định hàm kéo chuỗi con cần thiết từ mỗi điểm bắt đầu hợp lệ.

Đã lưu hai byte, vì dường như không cần lưu trữ lambda.


1

V , 16 byte

òÀ|ly0Ïp
"_xòkVp

Tôi không sợ chơi golf lắm, tôi lo sợ, vật lộn với "xóa chuỗi nếu k> len (str)". Đầu vào là trong tập tin, k là một đối số. Chơi golf trước khi giải thích

Hãy thử trực tuyến!


Điều gì xảy ra nếu bạn không thử xử lý trường hợp k> len (str)?
Adám

Tùy thuộc vào phương pháp tôi sử dụng (cụ thể là trong phương thức này), nó chỉ để lại chuỗi như là
nmjcman101

1

ML chuẩn (mosml), 109 65 61 byte

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

Lấy một số và một danh sách ký tự (khá thay thế cho các chuỗi trong thế giới SML). (Thực sự hoạt động trên tất cả các danh sách của khóa học.)

Sử dụng:

- 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

Thay đổi:

  • Phải, có một thư viện chuẩn .. (-44 byte)
  • Thay đổi so sánh và không thành [] như được đề xuất (-4 byte)

1
Bạn có thể lưu một byte bằng cách thay đổi if length(x)<n thenthành if n>length(x)then. Tuy nhiên, vì SML hoàn toàn có thể xử lý các chuỗi, tôi không chắc chắn rằng nó được phép yêu cầu explodeđã được áp dụng cho chuỗi đầu vào.
Laikoni

Cũng then nil elsecó thể được rút ngắn để then[]else.
Laikoni

@Laikoni cũng không chắc, nhưng \ _ (ツ) _ / ¯
L3viathan

Sử dụng một số hàm thư viện khác, tôi nhận được một phiên bản 68 byte liên quan đến các chuỗi thay vì danh sách char. Ngoài ra, cách tiếp cận của bạn có thể được rút ngắn xuống còn 54 byte : fun f$n=if n>length$then[]else List.take($,n)::f(tl$)n.
Laikoni

1

JavaScript (Firefox 30-57), 51 byte

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

64 byte trong ES6:

(s,n,t=s.slice(0,--n))=>[...s.slice(n)].map(c=>(t+=c).slice(~n))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.