Вкажіть FuzzyFinder


14

Натхненний цим посиланням, я знайшов на Reddit .

FuzzyFinder - це особливість багатьох текстових редакторів. Коли ви починаєте вводити шлях до файлу S, FuzzyFinder починає і показує всі файли в поточному каталозі, що містять введений рядок, відсортований за позицією Sу файлі.

Ваше завдання - реалізувати нечіткий пошук. Це повинна бути програма або функція, яка бере (через stdin, аргумент функції або командний рядок) рядок Sі список рядків L, відформатованих за вашим бажанням, і повертає або друкує результат запуску нечіткого пошуку. Пошук повинен враховувати регістри. Результати, де Sзнаходиться в одній позиції в декількох рядках, можуть бути відсортовані, як завгодно.

Приклад:

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

Це кодовий гольф, тому найкоротше рішення виграє.


Чи можемо ми припустити, що всі дані є малими літерами, чи ми повинні нечітко відповідати і для верхнього регістру?
Кейд

1
@ Віоз- Ні; пошук повинен враховувати регістри. Я оновив питання та приклад.
kirbyfan64sos

Відповіді:


5

Pyth, 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
Це була точна та ж програма Pyth як я під час мого тестування. :)
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

CJam, 18 15 байт

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

Спробуйте його в Інтернеті в інтерпретаторі CJam .

I / O

Вхід:

"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

GolfScript, 13 байт

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

Це один з тих рідкісних випадків, коли GolfScript може перемогти CJam, використовуючи блокування конкатенації та взявши кілька свобод із входом, який можна відформатувати як завгодно .

Спробуйте його в Інтернеті у веб-GolfScript .

I / O

Вхідні дані

["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

JavaScript ES6, 68 байт

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

Це анонімна функція, яка приймає параметри s(рядок шляху файлу) та l(масив рядків). Сніппет стека нижче містить незворушний код, перетворений на ES5, тому більшість людей можуть його легко перевірити. (Якщо у вас є Firefox, ви можете використовувати гарніший тестовий набір 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

[Утримуйте] Pyth, 24 байти

JwKcwdVlK=G.)KI}JGaYG))Y

Спробуйте тут

Я досить новий у Code Golfing / Pyth, тому я не впевнений, що це оптимально, але я працюю над цим!

Оновлення: Я не думаю, що я насправді сортую правильно, і я не можу зробити так, щоб він працював. Я знаю, що oце впорядковане, і мені потрібно сортувати за положенням S, тому я використовую .:GlJдля того, щоб знайти всі підрядки довжини S для поточного елемента, Gа потім xдля того, щоб знайти індекс першого появи S, але, здається, я не можу встановити лямбда правильно.


Перевірте zі Q. Використовуючи їх, ви отримуєте відразу 18 байт. І ви можете прибрати lin VlK=> 17 байт ( посилання )
Jakube

До речі, ваш код не працює. Спробуйте тестовий випадок:imig mig migd do Mig imig
Якубе

У мене працює 9-байтне рішення. Якщо вам потрібна допомога в Pyth, приєднуйтесь до чату.
Якубе

О, круто! Я спробую розібратися, як ти це зробив сьогодні ввечері. Дякую за всю допомогу! (Вам потрібно заробити ще 1 бал репутації, перш ніж я можу навіть поспілкуватися: P)
cmxu

1
@Changming Дав вам точку. :)
kirbyfan64sos

2

JavaScript ( ES6 ), 68

Це майже те саме, що відповідь @NBM (навіть якщо він не скопійований), тому я не очікую анонсів. Насолоджуйтесь фрагментом все одно

Функція з аргументами рядка та рядкового масиву повертає масив рядків. Потім фільтруйте сортування.

Випробуйте фрагментарний фрагмент нижче (це лише EcmaScript 6, 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>


2

ОРАКЛ, 60

Чи враховується це?

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


Це може порахувати, але це повинна бути процедура Oracle, яка сприймає дані як аргументи.
kirbyfan64sos

Чи вважає це чи ні, я думаю, це здорово. Перше кодове рішення для гольфу, яке я дійсно розумію. Чудова робота!
Томас Веллер

@ThomasWeller Дякую! Ці гольфісти з кодом, безумовно, можуть бути дуже яскравими, але іноді KISS - це все, що вам потрібно!
MonkeyZeus

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

Рубі, 63

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

Біжи

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

Примітки

  1. Спочатку знайдіть усі відповідні слова за допомогою find_all
  2. Сортувати за позицією індексу слова, яке потрібно шукати.

Редагувати (від daneiro)

Рубі, 49

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 Будь ласка, опублікуйте це як свою відповідь. Я висуну!
bsd

1
Ні, це нормально :) Моя версія - це лише ваше покращення, я думаю, вони занадто схожі, щоб бути окремими відповідями. selectПсевдонім для find_all,і є в основному одними sortі sort_byтими ж речами в дещо різних упаковках. Я наголошу на тому, щоб ви думали про те саме рішення, що й я;)
Даніеро

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 байт

14 байт коду, +1 для -pпрапора.

Yq_@?ySKyN_FIg

Приймає список як аргументи командного рядка, а рядок із stdin. Спробуйте в Інтернеті!

Пояснення

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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.