k-mers / n-g ทั้งหมด


21

Intro

เรามีฮิสโทแกรมและการนับแต่ไม่แสดงรายการทั้งหมด

ทุก ๆ ปีDyalog Ltd.จัดการแข่งขันสำหรับนักเรียน ความท้าทายคือการเขียนรหัส APL ที่ดี นี่เป็นรุ่นที่ผู้ไม่เชื่อเรื่องภาษาของปัญหาที่หกของปีนี้

ฉันมีสิทธิ์อย่างชัดเจนในการโพสต์ความท้าทายนี้ที่นี่จากผู้เขียนต้นฉบับของการแข่งขัน รู้สึกอิสระที่จะตรวจสอบโดยทำตามลิงค์ที่ให้ไว้และติดต่อผู้เขียน

ปัญหา

คำ k-Mer มักจะหมายถึงทุกสตริงที่เป็นไปได้ของความยาวkที่มีอยู่ในสตริง ในฟังก์ชั่นการคำนวณ k-mers อ้างถึงองค์ประกอบที่เป็นไปได้ทั้งหมด (ความยาวk ) จากการอ่านที่ได้รับผ่านการหาลำดับดีเอ็นเอ เขียนฟังก์ชั่น / โปรแกรมที่รับสตริงและk (ความยาวซับสตริง) และส่งกลับ / เอาต์พุตเวกเตอร์ของ k-mers ของสตริงต้นฉบับ

ตัวอย่าง

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

k > ความยาวของสตริง? ย้อนกลับไม่มีอะไร / ผลว่างใด ๆ :
[4,"AC"][]หรือ""หรือ[""]


4
ลำดับของเอาต์พุตมีความสำคัญหรือไม่? เมื่อสตริงย่อยเกิดขึ้นหลายครั้งควรทำซ้ำในผลลัพธ์หรือไม่
feersum

1
ฉันสามารถส่งคืนสตริงของสตริงย่อยที่ต้องการคั่นด้วยการขึ้นบรรทัดใหม่แทนอาร์เรย์ของสตริงเช่นนี้ได้หรือไม่
Leun Nun

เราอาจป้อนและส่งออกสตริงเป็นอาร์เรย์ของอักขระ (เช่น['A', 'T', 'C', 'G']แทนที่ได้"ATCG"ไหม
Adnan

คำตอบ Dyalog APL อนุญาตให้ใช้ในการท้าทาย PPCG นี้หรือไม่ (เพราะ Dyalog เป็นเจ้าภาพด้วย)
Kritixi Lithos

1
@feersum เรื่องการสั่งซื้อและการทำซ้ำควรจะทำซ้ำ นี่เป็นเหมือนหน้าต่างบานเลื่อน
Adám

คำตอบ:


15

เยลลี่ขนาด 1 ไบต์

เจลลี่มีอะตอมไดมาดิคหนึ่งไบต์สำหรับการดำเนินการนี้

ลองออนไลน์! (ส่วนท้ายแยกรายการผลลัพธ์ด้วยการขึ้นบรรทัดใหม่เพื่อหลีกเลี่ยงการแสดงภาพที่พิมพ์ไม่เรียบ)


1
ยังไงก็ตามผู้ปฏิบัติการจะต้องรู้จัก ...
Leun Nun

1
@LeakyNun ฉันไม่ได้ทำจริงๆ
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 (GCC บน POSIX), 67 66 63 ไบต์

-3 ไบต์ขอบคุณ @LeakyNun!

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

ลองออนไลน์!


j=0ผมไม่คิดว่าคุณจะต้อง
Leun Nun

@LeakyNun ฟังก์ชันควรใช้ซ้ำได้ ลองออนไลน์! vs ลองออนไลน์!
betseg

แม้ว่าฉันจะทำสิ่งนี้ ...
เดิมพัน

1
คุณสามารถแทนที่j+i<=strlen(s)ด้วย justs[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

Python 3 ,  47 45 42 ไบต์

-3 ไบต์ด้วย ovs (ใช้การเปิด Python 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 TH (0-จัดทำดัชนี) องค์ประกอบเป็นต้นไปในการทดสอบว่ามีองค์ประกอบที่เหลือเพียงพอ (สตริงที่ว่างเปล่าเป็น falsey ในหลาม) - len(a)>=nนี่คือสั้นกว่าเทียบเท่า

  • หากมีองค์ประกอบพอที่รายการจะสร้าง[...]กับครั้งแรกnองค์ประกอบของสตริงa[:n]และผลแตกของการเรียกฟังก์ชั่นอีกครั้ง*f(...)กับรุ่น dequeued ของอินพุตปัจจุบัน a[1:](โดยองค์ประกอบแรก)

  • หากมีองค์ประกอบไม่เพียงพอหางของการสอบถามซ้ำจะa[n-1:]ถูกส่งคืนเมื่อถูกส่งคืน (ในกรณีนี้คือสตริงว่าง)

ลองออนไลน์!


45สำหรับ Python 2 หรือ 3 ด้วย:

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

@ovs ดีมากฉันถามว่าสิ่งนี้เป็นที่ยอมรับหรือไม่ (เนื่องจากผลลัพธ์ว่างเปล่าเป็นสตริงในขณะที่ผลลัพธ์ที่ไม่ว่างเปล่าเป็นรายการ)
Jonathan Allan

4

J , 2 ไบต์

,\

มันไม่ได้เป็นโปรแกรมที่สมบูรณ์ แต่เป็นฟังก์ชั่นที่มีโอเปอเรเตอร์

เรียกมันว่า:

echo 4 ,\ 'ATCGAAGGTCGT'

ลองออนไลน์!

มันทำงานอย่างไร

โอเปอเรเตอร์ (เรียกว่า "ร่วม") \(ชื่อ " มัด ") ใช้เช่น:

(x u\ y)ใช้กริยาuกับส่วนต่อเนื่องของรายการy(เรียกว่า infixes)

ฟังก์ชั่น (เรียกว่า "กริยา") uในกรณีนี้คือฟังก์ชั่น,ซึ่งเป็นฟังก์ชั่น" ผนวก " ที่เรียบง่าย:

สร้างอาร์เรย์ที่มีรายการของตามรายการของxy


3

Mathematica ขนาด 21 ไบต์

##~StringPartition~1&

ฟังก์ชั่นไม่ระบุชื่อ รับสตริงและตัวเลข (ตามลำดับนั้น) เป็นอินพุตและส่งคืนรายการสตริงเป็นเอาต์พุต


3

R, 65 61 ไบต์

-2 ไบต์ต้องขอบคุณ MickyT

-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))ถ้า(n>x,'',substring(s,1:(x-n+1),n:x))
MickyT

@MickyT ขอบคุณ! ฉันยังสังเกตเห็นว่าฉันสามารถลดไบต์ด้วยการเปลี่ยนการคำนวณดัชนี
จูเซปเป้

2

Pyth , 2 ไบต์

.:

มันไม่ได้เป็นโปรแกรมที่สมบูรณ์ แต่เป็นฟังก์ชั่นในตัว

เรียกมันว่า:

.:"ATCGAAGGTCGT"4

ลองออนไลน์!

โปรแกรมเต็มรูปแบบ:

.:.*

ลองออนไลน์!

(The .*is splat.)


แม้ว่ามันจะไม่สำคัญ แต่.:Fจะมีขนาดที่สั้นลงสำหรับโปรแกรมเต็ม
FryAmTheEggman

2

แมงกะพรุนขนาด 7 ไบต์

p
_I
\i

ลองออนไลน์!

มันทำงานอย่างไร

ในเชิงเส้น: p(\(I,i))ที่pคือการพิมพ์และ\ได้รับสตริงที่จำเป็น

Iเป็นอินพุตแรกในขณะiที่อินพุตที่สองถูกประเมิน

ในแมงกะพรุนทุกฟังก์ชั่นและโอเปอเรเตอร์จะได้รับสองข้อโต้แย้งหนึ่งรายการจากด้านขวาและอีกหนึ่งรายการจากด้านล่าง ที่นี่ฟังก์ชั่นpได้รับการโต้แย้งจากผลลัพธ์ของ_ซึ่งเป็นสิ่งจำเป็นถ้าเราจะใช้ผู้ประกอบการที่\จะได้รับสตริง



2

Java (OpenJDK 8) , 92 ไบต์

void f(String s,int n){for(int i=n;i<=s.length();)System.out.println(s.substring(i-n,i++));}

ลองออนไลน์!


คุณสามารถตีกอล์ฟได้ 3 ไบต์เช่นนี้: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;}
Kevin Cruijssen

1
@KevinCruijssen ฉันเปลี่ยนคำตอบแล้ว
Leun Nun

2

Clojure, 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

CJam , 4 ไบต์

{ew}

บล็อกที่ไม่ระบุชื่อที่คาดว่าจะมีข้อโต้แย้งในสแต็กและปล่อยให้ผลลัพธ์ในกองหลัง

ลองออนไลน์!

ew เป็นในตัวที่ทำสิ่งที่ต้องการ


5
ฉันมีเพียงสิ่งเดียวที่จะพูด: ew
Adám

2

เรติน่า , 41 38 ไบต์

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

ลองออนไลน์!

รับค่าสตริงและนับบนบรรทัดแยกกัน สองบรรทัดแรกถูกใช้เพื่อแปลงจำนวนจากทศนิยมเป็น unary ดังนั้นถ้ายอมรับอินพุต unary ดังนั้นจำนวนไบต์จะลดลงเป็น34 31 แก้ไข: บันทึก 3 ไบต์ขอบคุณ @FryAmTheEggman หรือหากคุณต้องการเวอร์ชัน 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องค์ประกอบในแนวนอน

ผลที่ได้คือ transposed (ใช้สลับซับซ้อนคอมเพล็กซ์ 'ซึ่งสั้นกว่า transpose .') เพื่อเปลี่ยนคอลัมน์เป็นแถวและจากนั้นจะถูกแปลงกลับเป็นถ่าน ( [... '']ซึ่งสั้นกว่ามาตรฐานchar(...))



1

Python 3 , 49 ไบต์

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

ลองออนไลน์!

วิธีแก้ปัญหาแบบเรียกซ้ำแม้ว่าจะไม่สั้น

เข้ากันได้กับ Python 2


คุณสามารถวางf=บันทึกสองไบต์เพราะคุณไม่ได้ใช้fที่อื่น โดยค่าเริ่มต้นฟังก์ชั่นที่เพิ่งประกาศและไม่ได้ใช้จะไม่มีชื่อ
Mr. Xcoder


1

Haskell, 39 ไบต์

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

ตัวอย่างการใช้งาน: ->4 # "ABCDEF" ลองออนไลน์!["ABCD","BCDE","CDEF"]

recursion ง่ายๆที่ช่วยให้คนแรกที่ตัวอักษรของสายป้อนที่ยังคงมีหางของสตริงตราบเท่าความยาวไม่น้อยกว่าnn


1

เซิร์ฟเวอร์ Microsoft Sql, 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

Ruby, 48 46 ไบต์

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

ไม่มีเทคนิคเฉพาะเพียงแค่ stabby-lambda ที่กำหนดฟังก์ชั่นที่ดึงสตริงย่อยที่ต้องการจากแต่ละจุดเริ่มต้นที่ถูกต้อง

บันทึกสองไบต์เนื่องจากไม่จำเป็นต้องเก็บแลมบ์ดา


1

V , 16 ไบต์

òÀ|ly0Ïp
"_xòkVp

ไม่ค่อยกลัวกอล์ฟฉันกลัวการดิ้นรนกับ "ลบสายถ้า k> len (str)" อินพุตอยู่ในไฟล์ k เป็นอาร์กิวเมนต์ การเล่นกอล์ฟก่อนอธิบาย

ลองออนไลน์!


จะเกิดอะไรขึ้นถ้าคุณไม่พยายามจัดการเคส k> len (str)?
อดัม

ขึ้นอยู่กับวิธีที่ฉันใช้ (โดยเฉพาะอย่างยิ่งในนี้) มันแค่ทิ้งสตริงตามที่เป็นอยู่
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 ไบต์)
  • เปลี่ยนการเปรียบเทียบและไม่มีเป็น [] ตามที่แนะนำ (-4 ไบต์)

1
คุณสามารถบันทึกไบต์โดยการเปลี่ยนไปif length(x)<n then if n>length(x)thenอย่างไรก็ตามเนื่องจาก SML สามารถจัดการกับสตริงได้อย่างสมบูรณ์แบบฉันจึงไม่แน่ใจว่าได้รับอนุญาตให้explodeใช้กับสตริงอินพุตแล้ว
Laikoni

นอกจากนี้ยังสามารถลงไปthen nil else then[]else
Laikoni

@Laikoni ไม่แน่ใจเหมือนกัน แต่¯ \ _ (ツ) _ / ¯
L3viathan

ใช้ฟังก์ชั่นห้องสมุดอื่น ๆ ฉันได้รุ่น 68 ไบต์ซึ่งเกี่ยวข้องกับสตริงแทนรายการ char นอกจากนี้ยังมีวิธีการของคุณจะสั้นลงถึง 54 fun f$n=if n>length$then[]else List.take($,n)::f(tl$)nไบต์:
Laikoni

1

JavaScript (Firefox 30-57), 51 ไบต์

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

64 ไบต์ใน ES6:

(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.