सबसे कम विशिष्ट सबस्ट्रिंग की पहचान


23

तार की एक सूची को देखते हुए, प्रत्येक स्ट्रिंग को उसके गैर-खाली सब्सट्रिंग्स में से एक से बदलें जो सूची में किसी भी अन्य स्ट्रिंग का विकल्प नहीं है और जितना संभव हो उतना छोटा है।

उदाहरण

सूची को देखते हुए ["hello","hallo","hola"], "hello"बस द्वारा प्रतिस्थापित किया जाना चाहिए "e"के रूप में इस स्ट्रिंग में निहित नहीं है "hallo"और "hola"और यह संभव के रूप में कम के रूप में है। "hallo"या तो द्वारा प्रतिस्थापित किया जा सकता है "ha"या "al"और "hola"से किसी के द्वारा "ho", "ol"या "la"

नियम

  • आप मान सकते हैं कि तार गैर-रिक्त होंगे और केवल एक ही मामले के वर्णमाला वर्ण होते हैं।
  • आप मान सकते हैं कि सूची में प्रत्येक स्ट्रिंग के लिए इस तरह का एक विकल्प मौजूद है, अर्थात सूची में कोई भी स्ट्रिंग किसी अन्य स्ट्रिंग का विकल्प नहीं होगी।
  • इनपुट और आउटपुट किसी भी उचित प्रारूप में हो सकते हैं।
  • यह , इसलिए अपनी पसंद की भाषा में यथासंभव कम बाइट्स का उपयोग करने का प्रयास करें।

परीक्षण के मामलों

अधिकांश मामलों के लिए केवल एक संभावित आउटपुट दिया जाता है।

["ppcg"] -> ["p"] (or ["c"] or ["g"])
["hello","hallo","hola"] -> ["e","ha","ho"]
["abc","bca","bac"] -> ["ab","ca","ba"]
["abc","abd","dbc"] -> ["abc","bd","db"]
["lorem","ipsum","dolor","sit","amet"] -> ["re","p","d","si","a"]
["abc","acb","bac","bca","cab","cba"] -> ["abc","acb","bac","bca","cab","cba"]

संबंधित: सबसे कम पहचानने वाले पदार्थ - समान विचार, लेकिन अधिक शामिल नियम और बोझिल प्रारूप।


क्यों ""(खाली स्ट्रिंग) एकल "ppcg"मामले के लिए विशिष्ट पहचान नहीं है ?
मूसबॉयस

2
@MooseBoys स्ट्रिंग की एक सूची को देखते हुए यह में से एक के द्वारा एक स्ट्रिंग की जगह गैर खाली सबस्ट्रिंग
श्री Xcoder

जवाबों:




4

पायथ , 12 बाइट्स

mhf!ts}LTQ.:

यहाँ यह कोशिश करो!

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

बेसिकल प्रत्येक के सबस्ट्रिंग को फ़िल्टर करता है जो सूची में स्ट्रिंग्स में से एक में होता है (यानी, यह उस स्ट्रिंग के लिए अद्वितीय है) और पहला प्राप्त करता है।

mhf!ts}LTQ.:     Full program, Q=eval(stdin_input())
m         .:     Map over Q and obtain all the substrings of each.
  f              And filter-keep those that satisfy (var: T)...
      }LTQ       ... For each string in Q, yield 1 if it contains T, else 0.
   !ts           ... Sum the list, decrement and negate. 
 h               Head. Yields the first valid substring, which is always the shortest.

4

प्रोलोग (एसडब्ल्यूआई) , 175 163 बाइट्स

S/L/R:-sub_string(S,_,L,_,R).
[H|T]+[I|R]:-string_length(H,L),between(1,L,X),H/X/I,T+R.
R+R.
L-R:-L+R,forall(member(E,L),findall(_,(member(F,R),\+ \+ E/_/F),[_])).

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

यहां ज्यादातर चीजें काफी स्पष्ट होनी चाहिए, लेकिन:

व्याख्या

हस्ताक्षर: ( += इनपुट, ?= वैकल्पिक, -= आउटपुट, := अभिव्यक्ति)

  • sub_string(+String, ?Before, ?Length, ?After, ?SubString)
  • string_length(+String, -Length)
  • member(?Elem, ?List)
  • between(+Low, +High, ?Value)
  • findall(+Template, :Goal, -Bag)
  • forall(:Cond, :Action)

\+ \+बस है not not(यानी एक मैच को बूलियन में परिवर्तित करता है (इस मामले में, इसे दोनों pको ppcgअलग-अलग मिलान करने से रोकता है ))


नौकरी के लिए सही उपकरण: पी इस तथ्य को छोड़कर कि यह मन-उड़ाने वाली क्रिया है
केवल




3

जावास्क्रिप्ट (ईएस 6), 93 बाइट्स

a=>a.map(s=>(L=s.length,g=n=>a.every(S=>S==s|!~S.search(u=s.substr(n%L,n/L+1)))?u:g(n+1))(0))

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

कैसे?

प्रत्येक स्ट्रिंग के लिए रों लंबाई के एल इनपुट सरणी में एक [] और के साथ शुरू n = 0 , हम पुनरावर्ती क्रिया का उपयोग ग्राम () सभी सबस्ट्रिंग उत्पन्न करने के लिए यू के एस के साथ:

u = s.substr(n % L, n / L + 1)

उदाहरण के लिए, s = "abc" और L = 3 के साथ :

 n | n%L | floor(n/L+1) | u
---+-----+--------------+-------
 0 |  0  |       1      | "a"
 1 |  1  |       1      | "b"
 2 |  2  |       1      | "c"
 3 |  0  |       2      | "ab"
 4 |  1  |       2      | "bc"
 5 |  2  |       2      | "c"
 6 |  0  |       3      | "abc"
 7 |  1  |       3      | "bc"
 8 |  2  |       3      | "c"

कुछ पदार्थ कई बार उत्पन्न होते हैं, लेकिन इससे कोई फर्क नहीं पड़ता। यह महत्वपूर्ण है कि लंबाई N के सभी प्रतिस्थापनों को N + 1 के किसी भी विकल्प से पहले उत्पन्न किया गया है ।

हम जितनी जल्दी हो प्रक्रिया को रोकने के रूप में यू किसी में नहीं पाया जा सकता है अन्य स्ट्रिंग एस में एक [] जो गारंटी है, तो होना ही जब यू == है सबसे खराब स्थिति में, चुनौती नियम # 2 के अनुसार:

सूची में कोई भी स्ट्रिंग किसी अन्य स्ट्रिंग्स का विकल्प नहीं होगी

इसलिए, उपरोक्त उदाहरण में, चरण 7 और 8 वास्तव में कभी भी संसाधित नहीं होंगे।


2

पॉवरशेल , 107 बाइट्स

($a=$args)|%{$(for($i=0;$i++-lt($g=($s=$_)|% Le*)){0..($g-$i)|%{$s|% s*g $_ $i}|?{!($a-match$_-ne$s)}})[0]}

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

व्याख्या

आपूर्ति की गई प्रत्येक स्ट्रिंग के लिए (और पूरे सरणी को असाइन करें $a):

  • forस्ट्रिंग के प्रत्येक प्रतिस्थापन लंबाई (1 आधारित) पर एक लूप करें (स्ट्रिंग को ही $sऔर लंबाई को निर्दिष्ट करते हुए $g)
  • प्रत्येक लंबाई के लिए ( $i):
    • एक इंडेक्स लूप बनाएं, 0 से लंबाई तक - $iफिर प्रत्येक इंडेक्स के लिए:
      • $sस्थिति $_(सूचकांक) और लंबाई पर वर्तमान स्ट्रिंग ( ) का विकल्प प्राप्त करें$i
      • पास करने के लिए Where-Object( ?), और इसे लौटाएँ यदि:
        • सरणी ( $a) का सबसेट जिसमें वर्तमान स्ट्रिंग $sनहीं है, वर्तमान प्रतिस्थापन के लिए एक मैच नहीं है$_

वापस स्ट्रिंग स्तर पर, हमारे पास इस स्ट्रिंग के सभी सबस्ट्रिंग हैं जो दूसरों में नहीं पाए गए थे, इसलिए पहले एक लें [0]क्योंकि हमें केवल उनमें से एक की आवश्यकता है, फिर अगले स्ट्रिंग के साथ जारी रखें।


0

सी # (विजुअल सी # इंटरएक्टिव कंपाइलर) , 149 बाइट्स

a=>a.Select(s=>{var t=s;for(int j=0,k,l=s.Length;j++<l;)for(k=-1;j+k++<l;)if(!a.Where(u=>s!=u&u.Contains(t=s.Substring(k,j))).Any())j=k=l;return t;})

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

कम गोल्फ वाले ...

// a is an input array of strings
a=>
  // iterate over input array   
  a.Select(s=>{
    // t is the result string
    var t=s;
    // j is the substring length
    for(int j=0,k,l=s.Length;j++<l;)
      // k is the start index
      for(k=-1;j+k++<l;)
        // LINQ query to check if substring is valid
        // the tested string is collected in t
        if(!a.Where(u=>s!=u&u.Contains(t=s.Substring(k,j))).Any())
          // break loops
          j=k=l;
    // return result
    return t;
  })
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.