Bir FuzzyFinder Uygula


14

Reddit'te bulduğum bu bağlantıdan ilham aldım .

Bir FuzzyFinder birçok metin editörünün bir özelliğidir. Bir dosya yolu Syazmaya başladığınızda, FuzzyFinder devreye girer ve girdiğiniz dizeyi içeren geçerli dosyaları S, dosyanın konumuna göre sıralanmış olarak gösterir .

Senin görevin bulanık bir bulucu uygulamaktır. İstediğiniz şekilde biçimlendirilmiş bir dizeyi Sve dizeleri içeren (stdin, işlev bağımsız değişkeni veya komut satırı aracılığıyla) program veya işlev olmalıdır Lve bulanık bulucuyu çalıştırmanın sonucunu döndürür veya yazdırır. Arama büyük / küçük harfe duyarlı olmalıdır. Sonuçlar Sçoklu dizelerinde aynı pozisyonda sıralanması edilir ancak diliyorum.

Misal:

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

Bu kod golf, bu yüzden en kısa çözüm kazanır.


Tüm girdilerin küçük harf olduğunu varsayabilir miyiz, yoksa büyük harf için de bulanık mıdır?
Kade

1
@ Vioz- Hayır; arama büyük / küçük harfe duyarlı olmalıdır. Soruyu ve örneği güncelledim.
kirbyfan64sos

Yanıtlar:


5

Pyth, 9 bayt

oxNzf}zTQ

Çevrimiçi deneyin: Gösteri

Açıklama:

            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
Bu oldu tam benim test sırasında olduğu gibi aynı Pyth programı. :)
kirbyfan64sos

5

Python 2, 65

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

Sentezleme x.find(s)ilk geçtiği pozisyonunu geri sin xveren -1bir maç için. Sonucu 1, hiçbir eşleşmenin karşılık gelmediğini ve 0bizi filterdışarı çıkardığını ekliyoruz . Daha sonra, 1'e kaydırmadan etkilenmeyen maç pozisyonuna göre sıralarız.


5

CJam, 18 15 bayt

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

CJam yorumlayıcısında çevrimiçi deneyin .

I / O

Giriş:

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

Çıktı:

["mig" "migd" "imig"]

Nasıl çalışır

      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

GolfScript, 13 bayt

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

Bu, GolfScript'in blok birleştirmeyi kullanarak ve istediğiniz şekilde biçimlendirilebilen girdiyle birkaç özgürlük alarak CJam'ı yenebileceği nadir olaylardan biridir .

Web GolfScript'te çevrimiçi deneyin .

I / O

Giriş

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

Çıktı

["migd" "mig" "imig"]

Nasıl çalışır

~             # 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

JavaScript ES6, 68 bayt

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

Bu, parametreleri s(dosya yolu dizesi) ve l(dizeler dizisi ) alan anonim bir işlevdir . Aşağıdaki Yığın Snippet'i, ES5'e dönüştürülmüş ungolfed kodu içerir, böylece daha fazla kişi kolayca test edebilir. (Firefox'unuz varsa, cevabında bulunan edc65'in daha güzel test paketini kullanabilirsiniz.)

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>


Vaov! aptal bana bir test paketi hazırlarken zaman kaybediyor!
edc65

3

[Basılı Tutun] Pyth, 24 Bayt

JwKcwdVlK=G.)KI}JGaYG))Y

Deneyin burada

Code Golfing / Pyth'te oldukça yeniyim, bu yüzden optimal olduğundan emin değilim, ama üzerinde çalışıyorum!

Güncelleme: Aslında doğru şekilde sıraladığımı sanmıyorum ve işe yaramayacak gibi görünüyor. Ben bu osıraya göre biliyorum , ve ben S konumuna göre sıralamak gerekir, bu yüzden .:GlJgeçerli öğe için S uzunluğunun tüm alt dizeleri bulmak için Gve daha sonra xilk oluşum dizini bulmak için kullanıyorum S, ama lambda'yı doğru ayarlayamıyorum.


Kontrol edin zve Q. Bunları kullanmak size hemen 18 bayt verir. Ve lin VlK=> 17 bayt ( bağlantı )
kaldırabilirsiniz

Btw, kodunuz çalışmıyor. Test imig mig migd do Mig imig
senaryosunu

Çalışan 9 baytlık bir çözümüm var. Pyth'te yardım almak için sohbete katılın.
Jakube

Vaay havalı! Bu gece nasıl yaptığını anlamaya çalışacağım. Tüm yardımlarınız için teşekkürler! (Sohbet etmeden önce 1 itibar puanı kazanmalıyım: P)
cmxu

1
@Changming Size puan verdi. :)
kirbyfan64sos

2

JavaScript ( ES6 ), 68

@NBM yanıtı neredeyse aynı (kopyalanmamış olsa bile), bu yüzden upvotes beklemiyorum. Snippet'in tadını çıkarın

Dize ve dize dizisi bağımsız değişkenlerine sahip bir işlev, bir dize dizisi döndürür. Filtrele ve sırala.

Aşağıdaki snippet'i test runnign (yalnızca EcmaScript 6, Firefox olarak)

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

Bu önemli mi?

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


Sayılabilir, ancak verileri argüman olarak alan bir Oracle prosedürü olması gerekir .
kirbyfan64sos

Önemli olsun ya da olmasın, bence havalı. Gerçekten anladığım ilk kod golf çözümü. Harika iş!
Thomas Weller

@ThomasWeller Teşekkürler! Bu kod golfçüler kesinlikle çok parlak olabilir, ancak bazen ihtiyacınız olan KISS!
MonkeyZeus

2

Haskell, 129 116

116 (Franky sayesinde):

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)))

Oldukça uzun, belki biraz nasıl kısaltacağımı bulabilirim ...


1
13:h s=map snd.sort.map(\x->((head[c|c<-[0..length x],isPrefixOf s(drop c x)]),x)).filter(isInfixOf s)
Franky

2

Python 2, 69 68 66 Bayt

Ben sadece bir sdize listesinde eşleştirmek için dize olarak alır bir işlev oluşturdun

Edit 1: Baytta golf oynadığı için Jakube'e teşekkürler.

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

Buradan kontrol edin.


1

Ruby, 63

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

Çalıştırmak

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

notlar

  1. Önce ile eşleşen tüm kelimeleri bul find_all
  2. Aranacak kelimenin dizin konumuna göre sıralayın.

Düzenle (daneiro tarafından)

Yakut, 49

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

1
49 karakterde aynı şey:p=->w,l{l.select{|x|x[w]}.sort_by{|e|e.index(w)}}
daniero

@daniero Lütfen cevabınızı gönderiniz. Ben oylayacağım!
BSD

1
Hayır, bu gerçekten iyi :) Benim versiyonum sadece sizin için bir gelişme, ayrı cevaplar için çok benzer olduklarını düşünüyorum. selectiçin bir takma ad find_all,ve sortve sort_by temelde biraz farklı ambalajlarda aynı şeylerdir. Benimle aynı çözümü düşündüğünüz için bunun yerine sizi oylayacağım;)
daniero

0

Raket 46 bayt

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

Kullanımı:

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

Test yapmak:

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

Çıktı:

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


0

Pip , 15 bayt

14 bayt kod, -pbayrak için +1 .

Yq_@?ySKyN_FIg

Listeyi komut satırı argümanları ve dizeyi stdin'den alır. Çevrimiçi deneyin!

açıklama

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.