Zaimplementuj FuzzyFinder

14

Inspirowany tym linkiem znalazłem na Reddit .

FuzzyFinder to funkcja wielu edytorów tekstu. Gdy zaczynasz wpisywać ścieżkę pliku S, FuzzyFinder uruchamia się i wyświetla wszystkie pliki w bieżącym katalogu zawierające wprowadzony ciąg, posortowane według pozycjiS w pliku.

Twoim zadaniem jest zaimplementować rozmytą wyszukiwarkę. Powinien to być program lub funkcja, która pobiera (za pomocą stdin, argumentu funkcji lub wiersza poleceń) ciąg znaków Si listę ciągów L, sformatowanych w dowolny sposób i zwraca lub drukuje wynik działania wyszukiwarki rozmytej. W wyszukiwaniu rozróżniana jest wielkość liter. Wyniki gdzieS jest w tej samej pozycji w wielu ciągach, mogą być sortowane według własnego uznania.

Przykład:

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

To jest golf golfowy, więc wygrywa najkrótsze rozwiązanie.

kirbyfan64sos
źródło
Czy możemy założyć, że wszystkie dane wejściowe są pisane małymi literami, czy też powinniśmy zamazywać dopasowanie również dla wielkich liter?
Kade
1
@ Vioz- No; w wyszukiwaniu rozróżniana jest wielkość liter. Zaktualizowałem pytanie i przykład.
kirbyfan64sos

Odpowiedzi:

5

Pyth, 9 bajtów

oxNzf}zTQ

Wypróbuj online: demonstracja

Wyjaśnienie:

            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
źródło
1
Był to dokładnie ten sam program Pyth, który miałem podczas testów. :)
kirbyfan64sos
5

Python 2, 65

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

Wyrażenie x.find(s)zwraca pozycję pierwszego wystąpienia sin x, dając -1brak dopasowania. Dodajemy 1do wyniku, że nie odpowiada mecz 0, pozwalając nam filterje wyrzucić. Następnie sortujemy według pozycji dopasowania, na którą nie ma wpływu przesunięcie o 1.

xnor
źródło
5

CJam, 18 15 bajtów

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

Wypróbuj online w interpretatorze CJam .

I / O

Wejście:

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

Wynik:

["mig" "migd" "imig"]

Jak to działa

      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
źródło
5

GolfScript, 13 bajtów

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

Jest to jedna z tych rzadkich sytuacji, w których GolfScript może pokonać CJam, wykorzystując konkatenację bloków i biorąc kilka swobód z danymi wejściowymi, które można dowolnie sformatować .

Wypróbuj online w Web GolfScript .

I / O

Wejście

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

Wynik

["migd" "mig" "imig"]

Jak to działa

~             # 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
źródło
3

JavaScript ES6, 68 bajtów

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

Jest to anonimowa funkcja, która pobiera parametry s(ciąg ścieżki pliku) i l(tablica ciągów). Poniższy fragment kodu zawiera niezgolfowany kod przekonwertowany na ES5, aby więcej osób mogło go łatwo przetestować. (Jeśli masz Firefox, możesz użyć ładniejszego pakietu testowego edc65 znalezionego w jego odpowiedzi.)

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
źródło
Łał! głupie, że tracę czas na przygotowanie zestawu testowego!
edc65
3

[Przytrzymaj] Pyth, 24 bajty

JwKcwdVlK=G.)KI}JGaYG))Y

Spróbuj jest tutaj

Jestem całkiem nowy w Code Golfing / Pyth, więc nie jestem pewien, czy to optymalne, ale pracuję nad tym!

Aktualizacja: Nie sądzę, że właściwie sortuję i wydaje mi się, że nie mogę go uruchomić. Wiem, że ojest to kolejność i muszę sortować według pozycji S, więc używam .:GlJ, aby znaleźć wszystkie podłańcuchy długości S dla bieżącego elementu, Ga następnie xw celu znalezienia indeksu pierwszego wystąpienia S, ale nie mogę poprawnie ustawić lambdy.

cmxu
źródło
Sprawdź zi Q. Korzystanie z nich daje natychmiast 18 bajtów. I możesz usunąć lin VlK=> 17 bajtów ( link )
Jakube
Przy okazji twój kod nie działa. Wypróbuj przypadek testowy:imig mig migd do Mig imig
Jakube,
Mam działające rozwiązanie 9 bajtów. Jeśli potrzebujesz pomocy w Pyth, dołącz do czatu.
Jakube,
Fajnie! Spróbuję dowiedzieć się, jak to zrobiłeś dziś wieczorem. Dzięki za wszelką pomoc! (Będę musiał zdobyć jeszcze 1 punkt reputacji, zanim będę mógł czatować: P)
cmxu
1
@Changming Dał ci sens. :)
kirbyfan64sos
2

JavaScript ( ES6 ), 68

To prawie taka sama odpowiedź @NBM (nawet jeśli nie została skopiowana), więc nie oczekuję pozytywnych opinii. W każdym razie ciesz się fragmentem

Funkcja z ciągiem i argumentami tablicy ciągów zwraca tablicę ciągów. Filtruj, a następnie sortuj.

Testuj runnign poniżej (tylko EcmaScript 6, tylko 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
źródło
2

ORACLE, 60

Czy to się liczy?

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

MonkeyZeus
źródło
Może się liczyć, ale musiałaby to być procedura Oracle , która przyjmuje dane jako argumenty.
kirbyfan64sos
Czy to się liczy, czy nie, myślę, że to fajne. Pierwsze takie rozwiązanie do gry w golfa, jakie naprawdę rozumiem. Świetna robota!
Thomas Weller,
@ThomasWeller Thanks! Ci golfiści kodowi z pewnością mogą być bardzo bystrzy, ale czasami KISS to wszystko, czego potrzebujesz!
MonkeyZeus
2

Haskell, 129 116

116 (Dzięki 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)))

Cóż, jest dość długi, może znajdę jak to trochę skrócić ...

Pionek
źródło
1
ogolić się 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 bajtów

Właśnie stworzyłem funkcję, która bierze s jako ciąg znaków, aby dopasować na liście ciągówn

Edycja 1: Podziękowania dla Jakube za grę w bajt.

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

Sprawdź to tutaj.

Kade
źródło
1

Ruby, 63

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

Biegać

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

Notatki

  1. Najpierw znajdź wszystkie pasujące słowa z find_all
  2. Sortuj według pozycji indeksu szukanego słowa.

Edytuj (autor danychiro)

Ruby, 49

p=->w,l{l.select{|x|x[w]}.sort_by{|e|e.index(w)}}
bsd
źródło
1
To samo w 49 znakach:p=->w,l{l.select{|x|x[w]}.sort_by{|e|e.index(w)}}
daniero
@daniero Proszę opublikować jako odpowiedź. Będę głosować!
bsd
1
Nie, to naprawdę ok :) Moja wersja jest tylko ulepszeniem twojej, myślę, że są one zbyt podobne, aby mogły być osobnymi odpowiedziami. selectjest aliasem find_all,i sorti sort_by są zasadniczo te same rzeczy w nieco różnych opakowaniach. Zamiast tego będę cię głosować za myślenie o tym samym rozwiązaniu co ja;)
daniero
0

Rakieta 46 bajtów

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

Stosowanie:

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

Testowanie:

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

Wynik:

'("imig" "mig" "migd")
rnso
źródło
0

Groovy, 32 bajty

{a,b->a.findAll{it.contains(b)}}
Urna Magicznej Ośmiornicy
źródło
0

Pip , 15 bajtów

14 bajtów kodu, +1 dla -pflagi.

Yq_@?ySKyN_FIg

Pobiera listę jako argumenty wiersza polecenia i ciąg ze standardowego wejścia. Wypróbuj online!

Wyjaśnienie

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
źródło