Terapkan FuzzyFinder

14

Terinspirasi oleh tautan ini yang saya temukan di Reddit .

FuzzyFinder adalah fitur dari banyak editor teks. Ketika Anda mulai mengetikkan path file S, FuzzyFinder menendang masuk dan memperlihatkan kepada Anda semua file dalam direktori saat ini yang berisi string yang Anda masukkan, diurutkan berdasarkan posisi Sdalam file.

Tugas Anda adalah mengimplementasikan pencari fuzzy. Seharusnya program atau fungsi yang mengambil (melalui stdin, argumen fungsi, atau baris perintah) string Sdan daftar string L, diformat sesuai keinginan Anda, dan mengembalikan atau mencetak hasil menjalankan fuzzy finder. Pencarian harus case-sensitive. Hasil di mana Sberada di posisi yang sama di banyak string dapat diurutkan sesuai keinginan Anda.

Contoh:

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

Ini kode golf, jadi solusi terpendek menang.

kirbyfan64sos
sumber
Bisakah kita menganggap semua input dalam huruf kecil, atau haruskah kita fuzzy cocok untuk huruf besar juga?
Kade
1
@ Vioz- Tidak; pencarian harus peka huruf besar-kecil. Saya memperbarui pertanyaan dan contohnya.
kirbyfan64sos

Jawaban:

5

Pyth, 9 byte

oxNzf}zTQ

Cobalah online: Peragaan

Penjelasan:

            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
Jakube
sumber
1
Ini adalah program Pyth yang sama persis seperti yang saya miliki selama pengujian saya. :)
kirbyfan64sos
5

Python 2, 65

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

Ekspresi x.find(s)mengembalikan posisi kemunculan pertama sin x, memberi -1tanpa kecocokan. Kami menambahkan 1hasilnya ke yang tidak cocok sesuai dengan 0, membiarkan kami filterkeluar. Kami kemudian mengurutkan berdasarkan posisi pertandingan, yang tidak terpengaruh oleh perubahan oleh 1.

Tidak
sumber
5

CJam, 18 15 byte

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

Cobalah online di penerjemah CJam .

I / O

Memasukkan:

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

Keluaran:

["mig" "migd" "imig"]

Bagaimana itu bekerja

      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.
Dennis
sumber
5

GolfScript, 13 byte

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

Ini adalah salah satu kesempatan langka di mana GolfScript dapat mengalahkan CJam, dengan menggunakan blok concatenation dan mengambil beberapa kebebasan dengan input yang dapat diformat sesuai keinginan Anda .

Cobalah online di Web GolfScript .

I / O

Memasukkan

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

Keluaran

["migd" "mig" "imig"]

Bagaimana itu bekerja

~             # 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.
Dennis
sumber
3

JavaScript ES6, 68 byte

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

Ini adalah fungsi anonim yang mengambil parameter s(string jalur file) dan l(array string). Cuplikan Stack di bawah ini berisi kode yang tidak diubah yang dikonversi menjadi ES5 sehingga lebih banyak orang dapat mengujinya dengan mudah. (Jika Anda memiliki Firefox, Anda dapat menggunakan test suite edc65 yang lebih cantik yang ditemukan dalam jawabannya.)

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>

NinjaBearMonkey
sumber
Wow! konyol saya kehilangan waktu mempersiapkan test suite!
edc65
3

[Tahan] Pyth, 24 Bytes

JwKcwdVlK=G.)KI}JGaYG))Y

Coba di sini

Saya cukup baru di Code Golfing / Pyth jadi saya tidak yakin itu optimal, tapi saya sedang mengusahakannya!

Pembaruan: Saya tidak berpikir saya benar-benar menyortir dengan benar, dan sepertinya saya tidak bisa membuatnya berfungsi. Saya tahu itu oadalah urutan-oleh, dan saya perlu mengurutkan berdasarkan posisi S jadi saya menggunakan .:GlJuntuk menemukan semua substring dari panjang S untuk elemen saat ini Gdan kemudian xuntuk menemukan indeks kemunculan pertama dari S, tapi sepertinya saya tidak bisa mengatur lambda dengan benar.

cmxu
sumber
Lihat zdan Q. Menggunakannya memberi Anda segera 18 byte. Dan Anda dapat menghapus lin VlK=> 17 byte ( tautan )
Jakube
Btw, kode Anda tidak berfungsi. Coba test case:imig mig migd do Mig imig
Jakube
Saya punya solusi 9 byte yang berfungsi. Jika Anda ingin bantuan apa pun di Pyth, bergabunglah dengan obrolan.
Jakube
Oh keren! Saya akan mencoba mencari tahu bagaimana Anda melakukannya malam ini. Terima kasih atas semua bantuannya! (Akan perlu mendapatkan 1 poin reputasi lebih sebelum saya bahkan bisa ngobrol: P)
cmxu
1
@ Mengubah Memberi Anda intinya. :)
kirbyfan64sos
2

JavaScript ( ES6 ), 68

Itu hampir sama dengan jawaban @NBM (bahkan jika itu tidak disalin), jadi saya tidak mengharapkan upvotes. Nikmati potongannya

Fungsi dengan argumen string dan array string, mengembalikan array string. Saring lalu urutkan.

Uji runnign snippet di bawah ini (menjadi EcmaScript 6, hanya Firefox)

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>

edc65
sumber
2

ORACLE, 60

Apakah ini masuk hitungan?

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

MonkeyZeus
sumber
Bisa dihitung, tetapi itu harus menjadi prosedur Oracle yang mengambil data sebagai argumen.
kirbyfan64sos
Apakah itu penting atau tidak, saya pikir itu keren. Solusi golf kode pertama yang saya benar-benar mengerti. Kerja bagus!
Thomas Weller
@ Thomas terima kasih! Pegolf kode ini tentu saja bisa sangat cerdas tetapi terkadang CIUMAN adalah yang Anda butuhkan!
MonkeyZeus
2

Haskell, 129 116

116 (Terima kasih kepada Franky):

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

Yah, ini cukup panjang, mungkin saya akan menemukan cara untuk mempersingkatnya sedikit ...

Menggadaikan
sumber
1
mencukur 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 Bytes

Saya baru saja membuat fungsi yang mengambil ssebagai string untuk mencocokkan dalam daftar stringn

Sunting 1: Terima kasih kepada Jakube untuk bermain golf satu byte.

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

Lihat disini.

Kade
sumber
1

Ruby, 63

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

Lari

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

Catatan

  1. Pertama temukan semua kata yang cocok dengan find_all
  2. Urutkan berdasarkan posisi indeks kata yang akan dicari.

Edit (oleh daneiro)

Ruby, 49

p=->w,l{l.select{|x|x[w]}.sort_by{|e|e.index(w)}}
bsd
sumber
1
Hal yang sama dalam 49 karakter:p=->w,l{l.select{|x|x[w]}.sort_by{|e|e.index(w)}}
daniero
@daniero Silakan kirim sebagai jawaban Anda. Saya akan menang!
bsd
1
Nah, itu tidak apa-apa :) Versi saya hanyalah peningkatan dari Anda, saya pikir mereka terlalu mirip untuk menjadi jawaban yang terpisah. selectadalah alias untuk find_all,dan sortdan sort_by pada dasarnya adalah hal yang sama dalam bungkus yang sedikit berbeda. Saya akan mendukung Anda, karena memikirkan solusi yang sama dengan saya;)
daniero
0

Racket 46 byte

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

Pemakaian:

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

Pengujian:

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

Keluaran:

'("imig" "mig" "migd")
juga
sumber
0

Groovy, 32 byte

{a,b->a.findAll{it.contains(b)}}
Guci Gurita Ajaib
sumber
0

Pip , 15 byte

14 byte kode, +1 untuk -pbendera.

Yq_@?ySKyN_FIg

Mengambil daftar sebagai argumen baris perintah dan string dari stdin. Cobalah online!

Penjelasan

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