एक FuzzyFinder लागू करें


14

इस लिंक से प्रेरित होकर मैंने रेडिट पर पाया

एक FuzzyFinder कई पाठ संपादकों की एक विशेषता है। जैसे ही आप एक फ़ाइल पथ टाइप करना शुरू करते हैं S, FuzzyFinder अंदर आता है और आपको वर्तमान निर्देशिका में सभी फाइलें दिखाता है जिसमें आपके द्वारा दर्ज की गई स्ट्रिंग होती है, Sजो फ़ाइल की स्थिति के अनुसार क्रमबद्ध होती है ।

अपने काम के लिए एक फजी खोजक को लागू करने के लिए है। यह प्रोग्राम या फ़ंक्शन होना चाहिए जो (स्टड, फ़ंक्शन तर्क या कमांड लाइन के माध्यम से) एक स्ट्रिंग Sऔर स्ट्रिंग की एक सूची है L, जिसे आप चाहते हैं , स्वरूपित किया गया है और फ़ज़ी फ़ाइंडर को चलाने के परिणामस्वरूप रिटर्न या प्रिंट करता है। खोज केस-संवेदी होनी चाहिए। जहाँ परिणाम Sकई स्ट्रिंग्स में एक ही स्थिति में होता है, लेकिन आपकी इच्छा के अनुसार क्रमबद्ध किया जा सकता है।

उदाहरण:

Input: mig, [imig, mig, migd, do, Mig]
Output:
    [mig, migd, imig]
OR
    [migd, mig, imig]

यह कोड गोल्फ है, इसलिए सबसे छोटा समाधान जीतता है।


क्या हम मान सकते हैं कि सभी इनपुट लोअरकेस में हैं, या हमें ऊपरी मामले के लिए भी फजी मैच करना चाहिए?
केड

1
@ Vioz- नहीं; खोज केस-संवेदी होनी चाहिए। मैंने प्रश्न और उदाहरण को अद्यतन किया।
kirbyfan64sos

जवाबों:


5

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

oxNzf}zTQ

इसे ऑनलाइन आज़माएँ: प्रदर्शन

स्पष्टीकरण:

            implicit: z = input string, Q = input list
    f   Q   filter Q for elements T, which satisfy:
     }zT      z is substring of T
o           order the remaining strings N by:
 xNz          the index of z in N

1
यह ठीक उसी तरह का पाइथ कार्यक्रम था जैसा मैंने अपने परीक्षण के दौरान किया था। :)
kirbyfan64sos

5

अजगर 2, 65

def f(s,l):g=lambda x:x.find(s)+1;print sorted(filter(g,l),key=g)

अभिव्यक्ति x.find(s)की पहली घटना की स्थिति देता sहै x, -1बिना किसी मैच के। हम 1परिणाम के लिए जोड़ते हैं कि कोई भी मैच 0हमें मेल नहीं खाता filterहै। फिर हम मैच की स्थिति के अनुसार क्रमबद्ध हो जाते हैं, जो कि 1 से स्थानांतरित होकर अप्रभावित रहता है।


5

सीजाम, 18 15 बाइट्स

{1$#)}q~2$,@$p;

CJam दुभाषिया में इसे ऑनलाइन आज़माएं ।

आई / ओ

इनपुट:

"mig" ["imig" "mig" "migd" "do" "Mig"]

आउटपुट:

["mig" "migd" "imig"]

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

      q~        e# Read and evaluate the input from STDIN.
                e# Pushes a needle and an array of haystacks.
{    }          e# Define a code block:
 1$             e#   Copy the needle.
   #            e#   Compute the index of the needle in the haystack.
    )           e#   Add 1 to the index.
        2$      e# Copy the block.
          ,     e# Filter: Keep only haystacks for which the code block
                e#         pushed a non-zero value.
           @    e# Rotate the block on top of the stack.
            $   e# Sort: Arrange the haystacks according to the values
                e#       pushed by the code block.
             p  e# Print the filtered and sorted haystacks.
              ; e# Discard the needle.

5

गोल्फस्क्रिप्ट, 13 बाइट्स

~{?)}+\1$,\$`

यह उन दुर्लभ अवसरों में से एक है, जहां गोल्फक्राफ्ट सीजेएम को हरा सकते हैं, ब्लॉक कॉन्कैटिनेशन का उपयोग करके और इनपुट के साथ कुछ स्वतंत्रता ले सकते हैं जो कि स्वरूपित हो सकते हैं, लेकिन आप चाहें

इसे ऑनलाइन वेब गोल्फस्क्रिप्ट में आज़माएं

आई / ओ

इनपुट

["imig" "mig" "migd" "do" "Mig"] {"mig"}

उत्पादन

["migd" "mig" "imig"]

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

~             # Evaluate the input from STDIN.
              # Pushes an array of haystacks and a needle in a block.
 {?)}         # Push a code block that computes an index and increments it.
     +        # Concatenate that block with the needle block.
      \1$     # Swap the block with the arrays of haystacks and copy the block.
         ,    # Filter: Keep only haystacks for which the code block
              #         pushed a non-zero value.
          \   # Swap the array of haystacks with the code block.
           $  # Sort: Arrange the haystacks according to the values
              #       pushed by the code block.
            ` # Inspect: Format the array for pretty printing.

3

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

(s,l,f=j=>j.indexOf(s))=>l.filter(w=>~f(w)).sort((a,b)=>f(a)>f(b))

यह एक अनाम फ़ंक्शन है जो पैरामीटर s(फ़ाइल पथ स्ट्रिंग) और l( स्ट्रिंग की सरणी ) लेता है । नीचे दिए गए स्टैक स्निपेट में ईएस 5 में परिवर्तित असंगठित कोड होता है ताकि अधिक लोग इसे आसानी से परख सकें। (यदि आपके पास फ़ायरफ़ॉक्स है, तो आप उसके उत्तर में पाए गए edc65 के प्रीटीयर टेस्ट सूट का उपयोग कर सकते हैं।)

f=function(s,l){
  g=function(j){
    return j.search(s)
  }
  
  return l.filter(function(w){
    return ~g(w)
  }).sort(function(a,b){
    return g(a)>g(b)
  })
}

id=document.getElementById;run=function(){document.getElementById('output').innerHTML=f(document.getElementById('s').value,document.getElementById('l').value.split(', ')).join(', ')};document.getElementById('run').onclick=run;run()
<label>File path: <input type="text" id="s" value="mig" /></label><br />
<label>Files: <input type="text" id="l" value="imig, mig, migd, do, Mig" /></label><br />
<button id="run">Run</button><br />
Output: <output id="output"></output>


वाह! मूर्खतापूर्ण समय मुझे टेस्ट सूट की तैयारी में खो गया!
edc65

3

[पकड़ो] अजगर, २४ बाइट्स

JwKcwdVlK=G.)KI}JGaYG))Y

कोशिश यहाँ है

मैं कोड गोल्फिंग / पायथ में बहुत नया हूं इसलिए मुझे यकीन नहीं है कि यह इष्टतम है, लेकिन मैं इस पर काम कर रहा हूं!

अद्यतन: मुझे नहीं लगता कि मैं वास्तव में सही ढंग से छँटाई कर रहा हूँ, और मैं इसे काम करने के लिए प्रतीत नहीं कर सकता। मुझे पता है कि oऑर्डर-बाय है, और मुझे एस की स्थिति के अनुसार क्रमबद्ध करने की आवश्यकता है इसलिए मैं .:GlJवर्तमान तत्व के लिए एस की लंबाई के सभी सबस्ट्रिंग का पता लगाने के लिए उपयोग कर रहा हूं Gऔर फिर xपहली घटना के सूचकांक को खोजने के लिए। एस, लेकिन मैं लंबोदर को सही ढंग से सेट करने के लिए प्रतीत नहीं कर सकता।


बाहर की जाँच करें zऔर Q। इनके इस्तेमाल से आपको तुरंत 18 बाइट मिलती हैं। और अगर आप निकाल सकते हैं lमें VlK=> 17 बाइट ( लिंक )
Jakube

Btw, आपका कोड काम नहीं करता है। परीक्षण के मामले की कोशिश करें:imig mig migd do Mig imig
जकूबे

मैं एक काम कर रहा है 9 बाइट्स समाधान। यदि आप पायथ में कोई मदद चाहते हैं, तो चैट में शामिल हों।
जकुबे

ओह बढ़िया! मैं यह पता लगाने की कोशिश करूंगा कि आपने इसे आज रात कैसे किया। पूरी सहायताके लिए शुक्रिया! (इससे पहले कि मैं चैट भी कर
सकूं

1
@Changming ने आपको बात बताई। :)
kirbyfan64sos

2

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

यह लगभग @NBM उत्तर के समान है (भले ही यह कॉपी न किया गया हो), इसलिए मुझे उम्मीद नहीं है। वैसे भी स्निपेट का आनंद लें

एक स्ट्रिंग और एक स्ट्रिंग सरणी तर्क के साथ एक फ़ंक्शन, एक स्ट्रिंग सरणी लौटाता है। फिर छानें।

नीचे दिए गए स्निपेट का परीक्षण करें (एक्मास्क्रिप्ट 6, फ़ायरफ़ॉक्स केवल)

f=(s,l,i=t=>t.indexOf(s))=>l.filter(t=>~i(t)).sort((t,u)=>i(t)-i(u))

$(function(){
  $("#S,#L").on("keyup", 
   function() { 
     $('#O').val(f(S.value,L.value.split('\n')).join('\n'))
   } );
  $("#S").trigger('keyup');
})
#S,#L,#O { width: 400px }
#L,#O { height: 100px }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Input String<br><input id=S value='mig'><br>
Input List<br><textarea id=L>
imig
mig
migd
do
Mig
</textarea><br>
Output List<br><textarea id=O readonly></textarea>


2

ORACLE, 60

क्या यह गिनती है?

select * from t where a like '%mig%' order by instr(a,'mig')


यह गिनती कर सकता है, लेकिन यह एक ओरेकल प्रक्रिया होनी चाहिए जो डेटा को तर्कों के रूप में लेती है।
kirbyfan64sos

यह मायने रखता है या नहीं, मुझे लगता है कि यह अच्छा है। पहला कोड गोल्फ समाधान जो मैं वास्तव में समझता हूं। अच्छा कार्य!
थॉमस वेलर

@ThomasWeller धन्यवाद! ये कोड गोल्फरों निश्चित रूप से बहुत उज्ज्वल हो सकता है, लेकिन कभी कभी KISS आप सभी की जरूरत है!
मंकीज़े

2

हास्केल, 129 116

116 (फ्रेंकी के लिए धन्यवाद):

import Data.List
h s=map snd.sort.map(\x->((head[c|c<-[0..length x],isPrefixOf s(drop c x)]),x)).filter(isInfixOf s)

129:

import Data.List
f s n=map snd(sort(map(\x->((head [c|c<-[0..length x],isPrefixOf s(drop c x)]),x))(filter(\x->isInfixOf s x)n)))

खैर, यह बहुत लंबा है, शायद मुझे पता चल जाएगा कि इसे कैसे छोटा करना है ...


1
शेव ऑफ 13:h s=map snd.sort.map(\x->((head[c|c<-[0..length x],isPrefixOf s(drop c x)]),x)).filter(isInfixOf s)
फ्रैंकी

2

पायथन 2, 69 68 66 बाइट्स

मैंने सिर्फ एक फ़ंक्शन बनाया है जो sस्ट्रिंग की सूची में मिलान करने के लिए स्ट्रिंग के रूप में लेता हैn

संपादित 1: बाइट को बंद करने के लिए जकुबे का धन्यवाद।

lambda s,n:sorted([x for x in n if s in x],key=lambda x:x.find(s))

यहां इसकी जांच कीजिए।


1

रूबी, ६३

p=->(w,l){l.find_all{|x|x[w]}.sort{|a,b|a.index(w)-b.index(w)}}

Daud

irb(main):022:0> p["mig", ["imig", "mig", "migd", "do", "Mig"]]
=> ["migd", "mig", "imig"]

टिप्पणियाँ

  1. पहले सभी मिलान शब्दों के साथ खोजें find_all
  2. खोजे जाने वाले शब्द की सूचकांक स्थिति के आधार पर छाँटें

संपादित करें (daneiro द्वारा)

रूबी, ४ ९

p=->w,l{l.select{|x|x[w]}.sort_by{|e|e.index(w)}}

1
49 अक्षरों में एक ही बात:p=->w,l{l.select{|x|x[w]}.sort_by{|e|e.index(w)}}
daniero

@daniero कृपया इसे अपने उत्तर के रूप में पोस्ट करें। मैं उत्थान करूंगा!
bsd

1
नहीं, यह वास्तव में ठीक है :) मेरा संस्करण सिर्फ तुम्हारा एक सुधार है, मुझे लगता है कि वे भी अलग-अलग उत्तरों के समान हैं। selectके लिए एक उपनाम है find_all,और sortऔर sort_by मूल रूप से थोड़ा अलग कफन में एक ही बातें हैं। मैं आपको इसके बदले में, मेरे जैसे ही समाधान के बारे में सोचकर;)
daniero

0

रैकेट 46 बाइट्स

(for/list((i l)#:when(string-contains? i s))i)

उपयोग:

(define (f s l)
 (for/list((i l)#:when(string-contains? i s))i))

परिक्षण:

(f "mig" '["imig" "mig" "migd" "do" "Mig"])

आउटपुट:

'("imig" "mig" "migd")


0

पिप , 15 बाइट्स

-pध्वज के लिए कोड के 14 बाइट्स, +1 ।

Yq_@?ySKyN_FIg

सूची को कमांड-लाइन आर्ग्स और स्टड से स्ट्रिंग के रूप में लेता है। इसे ऑनलाइन आज़माएं!

व्याख्या

Yq              Yank a line of stdin into y
           FIg  Filter array of cmdline args by this function:
        yN_       Count occurrences of y in arg
      SK        Sort the resulting list using this key function:
  _@?y            Index of y in arg
                Print the Pip representation of the list (implicit, -p flag)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.