퍼지 파인더 구현


14

Reddit에서 찾은이 링크에서 영감을 얻었습니다 .

FuzzyFinder는 많은 텍스트 편집기의 기능입니다. 파일 경로를 입력하기 시작 S하면 FuzzyFinder가 시작되고 입력 한 문자열이 포함 된 현재 디렉토리의 모든 파일을 파일의 위치별로 정렬 S하여 표시합니다.

당신의 임무는 퍼지 파인더를 구현하는 것입니다. (stdin, 함수 인수 또는 명령 행을 통해) 문자열 SL원하는 문자열 형식 의 목록 을 취하고 퍼지 파인더 실행 결과를 리턴하거나 인쇄하는 프로그램 또는 함수 여야합니다 . 검색은 대소 문자를 구분해야합니다. S여러 문자열에서 같은 위치에있는 결과 는 원하는대로 정렬 될 수 있습니다.

예:

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

이것은 코드 골프이므로 가장 짧은 솔루션이 승리합니다.


모든 입력이 소문자라고 가정 할 수 있습니까, 아니면 대문자와 일치하는 항목을 퍼지해야합니까?
Kade

1
@ Vioz- 아니오; 검색은 대소 문자를 구분해야합니다. 질문과 예제를 업데이트했습니다.
kirbyfan64sos 2016 년

답변:


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 2016 년

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

자바 스크립트 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 바이트를 제거 할 수 있습니다 ( link )
Jakube

Btw, 코드가 작동하지 않습니다. 테스트 사례를 시도하십시오 :imig mig migd do Mig imig
Jakube

작동하는 9 바이트 솔루션이 있습니다. Pyth에서 도움이 필요하면 채팅에 참여하십시오.
Jakube

오, 멋지다! 오늘 밤 어떻게 지 냈는지 알아 볼게요 모든 도움을 주셔서 감사합니다! (채팅하기 전에 평판 점수 1 점을 더 획득해야합니다. P)
cmxu

1
@Changming 요점을 알려주세요. :)
kirbyfan64sos 2016 년

2

자바 스크립트 ( 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 2016 년

계산 여부에 관계없이 멋지다고 생각합니다. 내가 이해 한 최초의 코드 골프 솔루션. 훌륭한 일!
Thomas Weller

@ThomasWeller 감사합니다! 이 코드 골퍼는 분명히 매우 밝을 수 있지만 때로는 KISS가 필요한 것입니다!
MonkeyZeus 2016 년

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

2

파이썬 2, 69 68 66 바이트

방금 s문자열 목록에서 일치시키는 문자열을 취하는 함수를 만들었습니다.n

편집 1 : 바이트 오프 골프 Jakube에게 감사드립니다.

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

@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 바이트 코드, -p플래그는 +1

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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.