सभी के-मेर्स / एन-ग्राम


21

पहचान

हमारे पास हिस्टोग्राम और गिनती है , लेकिन उन सभी को सूचीबद्ध नहीं किया गया है।

हर साल, Dyalog Ltd. एक छात्र प्रतियोगिता आयोजित करता है। वहां चुनौती है कि अच्छा एपीएल कोड लिखना है । यह इस साल की छठी समस्या का एक भाषा अज्ञेय संस्करण है।

मुझे प्रतियोगिता के मूल लेखक से इस चुनौती को पोस्ट करने की स्पष्ट अनुमति है। दिए गए लिंक का पालन करके और लेखक से संपर्क करके स्वतंत्र महसूस करें ।

संकट

के-मेर शब्द आमतौर पर एक स्ट्रिंग में निहित लंबाई k के सभी संभावित सबस्ट्रिंग को संदर्भित करता है । कम्प्यूटेशनल जीनोमिक्स में, के-मेर्स डीएनए अनुक्रमण के माध्यम से प्राप्त एक रीड से सभी संभावित बाद (लंबाई के ) का उल्लेख करते हैं । एक फ़ंक्शन / प्रोग्राम लिखें जो एक स्ट्रिंग और k (स्थानापन्न लंबाई) लेता है और मूल स्ट्रिंग के k-mers के वेक्टर को रिटर्न / आउटपुट करता है।

उदाहरण

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

k > स्ट्रिंग की लंबाई? कुछ भी नहीं / कोई भी खाली परिणाम लौटाएँ:
[4,"AC"][]या ""या[""]


4
क्या आउटपुट का क्रम मायने रखता है? जब एक विकल्प कई बार होता है, तो क्या इसे आउटपुट में दोहराया जाना चाहिए?
feersum

1
क्या मैं इस तरह के तार के बजाय न्यूलाइन द्वारा अलग किए गए आवश्यक पदार्थों की एक स्ट्रिंग वापस कर सकता हूं ?
लीक नून

क्या हम वर्णों की एक सरणी के रूप में इनपुट और आउटपुट भी कर सकते हैं (जैसे कि ['A', 'T', 'C', 'G']इसके बजाय "ATCG"?
Adnan

क्या PPCG चुनौती में Dyalog APL के उत्तर की अनुमति दी गई है (क्योंकि चुनौती भी Dyalog द्वारा होस्ट की गई है)?
कृति लिथोस

1
@ फ़ेर्सम क्रम मायने रखता है, और दोहराव को दोहराया जाना चाहिए। यह एक स्लाइडिंग विंडो की तरह है।
एडम

जवाबों:


15

जेली , 1 बाइट

इस बहुत ऑपरेशन के लिए जेली के पास एक एकल बाइट डाईएडिक परमाणु है

इसे ऑनलाइन आज़माएं! (पाद लेख मुद्रित होने से बचने के लिए नई सूची के साथ परिणामी सूची को विभाजित करता है।)


1
किसी तरह ओपी को पता चल गया होगा ...
लीक नन

1
@ LeakyNun मैं वास्तव में नहीं था।
'12

8

ऑक्टेव, 28 बाइट्स

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

इसे ऑनलाइन आज़माएं!

K> स्ट्रिंग की लंबाई के लिए ऑक्टेव 4.2.1-विंडो में काम करता है लेकिन टियो (ऑक्टेव 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 on 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
लीक नून

@LeakyNun फ़ंक्शन को पुन: प्रयोज्य किया जाना चाहिए। इसे ऑनलाइन आज़माएं! बनाम यह ऑनलाइन कोशिश करो!
betseg

हालांकि अगर मैं कर इस ...
betseg

1
आप j+i<=strlen(s)सिर्फs[j+i]
क्रिस्सी लिथोस

5

ब्रेकीलॉग , 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 बाइट्स

-3 बाइट्स ओव्स के लिए धन्यवाद ( a[n-1:]पूंछ पर पुन: उपयोग करने के लिए पायथन 3 के अनपैकिंग का उपयोग करें ।)

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

स्ट्रिंग, aऔर स्लाइस की लंबाई n, और स्लाइस या एक खाली स्ट्रिंग की सूची को वापस लेकर एक पुनरावर्ती कार्य ।

a[n-1:]यह जांचने के लिए कि क्या पर्याप्त तत्व शेष हैं (पायथन में एक खाली स्ट्रिंग गलत है) - n-1 th (0-indexed) तत्व से आगे की ओर एक स्लाइस लेता है - यह समकक्ष से छोटा है len(a)>=n

  • यदि पर्याप्त तत्व हैं, तो एक सूची का निर्माण किया जाता है, स्ट्रिंग [...]के पहले nतत्वों के साथ a[:n], और *f(...)वर्तमान इनपुट के पहले के संस्करण के बिना एक विलेखित संस्करण के साथ फ़ंक्शन को फिर से कॉल करने का अनपैक्ड परिणाम है a[1:]

  • यदि पर्याप्त तत्व नहीं हैं, तो जब a[n-1:]वापस लौटाया जाता है (इस मामले में एक रिक्त स्ट्रिंग) पुनरावृत्ति की पूंछ तक पहुंच जाता है।

इसे ऑनलाइन आज़माएं!


पायथन 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 बाइट (अजगर 3) के लिए TIO
OVS

@ बहुत अच्छा, मैंने पूछा है कि क्या यह स्वीकार्य है (क्योंकि वे खाली परिणाम एक स्ट्रिंग है, जबकि गैर-रिक्त परिणाम एक सूची है)।
जोनाथन एलन

4

जे , 2 बाइट्स

,\

यह एक पूर्ण कार्यक्रम नहीं है, लेकिन एक ऑपरेटर के साथ एक फ़ंक्शन है।

इसे इस तरह से कॉल करें:

echo 4 ,\ 'ATCGAAGGTCGT'

इसे ऑनलाइन आज़माएं!

यह काम किस प्रकार करता है

ऑपरेटर (जिसे "संयोजन" कहा जाता है) \(जिसका नाम " infix " है) का उपयोग इस प्रकार किया जाता है:

(x u\ y)uसूची के क्रमिक भागों y(जिसे इनफ़िक्स कहा जाता है) पर क्रिया को लागू करता है ।

uइस मामले में फ़ंक्शन (जिसे "वर्ब" कहा जाता है) वह फ़ंक्शन है ,जो एक सरल " एपेंड " फ़ंक्शन है:

एक सरणी बनाता है जिसमें आइटमों का xअनुसरण होता है y


3

गणितज्ञ, 21 बाइट्स

##~StringPartition~1&

अनाम फ़ंक्शन। इनपुट के रूप में एक स्ट्रिंग और एक संख्या (उस क्रम में) लेता है और आउटपुट के रूप में स्ट्रिंग की एक सूची देता है।


3

आर, 65 61 बाइट्स

-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))अगर(n>x,'',substring(s,1:(x-n+1),n:x))
MickyT

@ मिक्की, धन्यवाद! मैंने यह भी देखा कि मैं सूचकांक संगणना को बदलकर कुछ बाइट्स को छोड़ सकता हूं
Giuseppe

2

अजगर , 2 बाइट्स

.:

यह एक पूर्ण कार्यक्रम नहीं है, बल्कि एक अंतर्निहित कार्य है।

इसे इस तरह से कॉल करें:

.:"ATCGAAGGTCGT"4

इसे ऑनलाइन आज़माएं!

पूरा कार्यक्रम:

.:.*

इसे ऑनलाइन आज़माएं!

(अलग .*है)


हालांकि यह वास्तव में मायने नहीं रखता है, .:Fलेकिन पूर्ण कार्यक्रम के लिए बाइट कम है।
FryAmTheEggman

2

जेलिफ़िश , 7 बाइट्स

p
_I
\i

इसे ऑनलाइन आज़माएं!

यह काम किस प्रकार करता है

रैखिक में: p(\(I,i))जहां pप्रिंट होता है और \आवश्यक पदार्थ मिलते हैं।

Iकच्चा पहला इनपुट है जबकि iमूल्यांकन किया गया दूसरा इनपुट है।

जेलिफ़िश में, प्रत्येक फ़ंक्शन और ऑपरेटर को दो तर्क मिलते हैं, एक दाईं ओर से, और एक नीचे से। यहां, फ़ंक्शन pको आउटपुट से तर्क मिलता है _, जिसकी आवश्यकता होती है यदि हम \सबस्ट्रिंग प्राप्त करने के लिए ऑपरेटर का उपयोग करते हैं ।



2

जावा (ओपनजेडके 8) , 92 बाइट्स

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

इसे ऑनलाइन आज़माएं!



1
@ केविनक्रूजसेन मैंने अपना उत्तर बदल दिया।
लीक नून

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

CJam , 4 बाइट्स

{ew}

बेनामी ब्लॉक जो स्टैक पर तर्कों की अपेक्षा करता है और परिणाम को स्टैक पर छोड़ देता है।

इसे ऑनलाइन आज़माएं!

ew एक बिल्ट-इन है कि वास्तव में क्या आवश्यक है।


5
मेरे पास कहने के लिए केवल एक चीज है: ew
Adám

2

रेटिना , 41 38 बाइट्स

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

इसे ऑनलाइन आज़माएं!

स्ट्रिंग लेता है और अलग-अलग लाइनों पर गिनता है। पहली दो पंक्तियों को दशमलव से युनिट में परिवर्तित करने के लिए उपयोग किया जाता है, इसलिए यदि यूरी इनपुट स्वीकार्य है तो बाइट की संख्या 34 31 तक कम हो जाएगी । संपादित करें: 3 बाइट्स @FryAmTheEggman के लिए धन्यवाद। या, यदि आप पसंद करते हैं, तो एक 48-बाइट संस्करण जो स्ट्रिंग में newlines को संभालता है, हालांकि यह भ्रामक आउटपुट का उत्पादन करता है:

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

@KritiiLithos मैं यह नहीं देखता कि कैसे आपका समाधान गिनती को ध्यान में रखता है ...
नील

ओह, क्षमा करें, मेरे पास सिर्फ एक मस्तिष्क गोज़ था> _ <
क्रिति लिथोस

यह आवश्यक रूप से, स्ट्रिंग एक नई पंक्ति शामिल कर सकते हैं अगर काम नहीं करता है तो मुझे लगता है आप बदल सकते हैं (?!)करने के लिए
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(...)) में बदल दिया जाता है।



1

पायथन 3 , 49 बाइट्स

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

इसे ऑनलाइन आज़माएं!

एक गैर-पुनरावर्ती समाधान, यद्यपि छोटा नहीं है।

अजगर 2 के साथ संगत।


आप f=दो बाइट्स बचा सकते हैं , क्योंकि आप fकहीं और उपयोग नहीं करते हैं। डिफ़ॉल्ट रूप से, ऐसे फ़ंक्शन जिन्हें केवल घोषित किया जाता है और उनका उपयोग नहीं किया जाता है, उन्हें अनाम नहीं छोड़ा जा सकता है।
श्री एक्सकोडर


1

हास्केल, 39 बाइट्स

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

प्रयोग उदाहरण: 4 # "ABCDEF"-> ["ABCD","BCDE","CDEF"]इसे ऑनलाइन आज़माएं!

एक सरल पुनरावृत्ति जो nइनपुट स्ट्रिंग के पहले वर्ण को रखता है वह स्ट्रिंग की पूंछ के साथ जारी रहती है जब तक कि इसकी लंबाई से कम नहीं होती है n




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]}}

कोई खास तरकीब नहीं, बस एक स्टैब्बी-लैम्ब्डा एक फ़ंक्शन को परिभाषित करता है जो प्रत्येक वैध प्रारंभिक बिंदु से आवश्यक विकल्प को खींचता है।

दो बाइट्स बचाए, क्योंकि लैंबडा स्टोर करने की जरूरत नहीं लगती।


1

वी , 16 बाइट्स

òÀ|ly0Ïp
"_xòkVp

बहुत अच्छी तरह से गोल्फ नहीं है मुझे डर है, "स्ट्रिंग को हटाएं यदि k> लेन (स्ट्रै)" के साथ संघर्ष कर रहा हूं। इनपुट फ़ाइल में है, k एक तर्क है। स्पष्टीकरण से पहले गोल्फ

इसे ऑनलाइन आज़माएं!


यदि आप k> len (str) केस को संभालने की कोशिश नहीं करते हैं तो क्या होता है?
एडम

मेरे द्वारा उपयोग की जाने वाली विधि के आधार पर (विशेष रूप से इस एक में) यह सिर्फ स्ट्रिंग छोड़ती है
nmjcman101

1

मानक एमएल (मस्जिद), 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। हालांकि, एसएमएल के लिए स्ट्रिंग्स को संभालना पूरी तरह से संभव है, मुझे यकीन नहीं है कि इसे explodeइनपुट स्ट्रिंग पर पहले से ही लागू करने की आवश्यकता है ।
लकोनी

को भी then nil elseछोटा किया जा सकता है then[]else
लकोनी

@ लिकोनी निश्चित नहीं है, लेकिन (\ _ (_) _ /
L

कुछ अन्य लाइब्रेरी फ़ंक्शंस का उपयोग करके मुझे एक 68 बाइट संस्करण मिला, जो चार सूचियों के बजाय तार से संबंधित है। इसके अलावा आपके दृष्टिकोण को 54 बाइट्स तक छोटा किया जा सकता है fun f$n=if n>length$then[]else List.take($,n)::f(tl$)n:।
लकोनी

1

जावास्क्रिप्ट (फ़ायरफ़ॉक्स 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))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.