ใช้ FuzzyFinder


14

แรงบันดาลใจจากการเชื่อมโยงนี้ผมพบว่าเมื่อ Reddit

FuzzyFinder เป็นคุณสมบัติของเครื่องมือแก้ไขข้อความหลายตัว เมื่อคุณเริ่มพิมพ์เส้นทางของไฟล์SFuzzyFinder จะเริ่มต้นและแสดงไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันที่มีสตริงที่คุณป้อนเรียงลำดับตามตำแหน่งของSไฟล์

งานของคุณคือการใช้เครื่องมือค้นหาฟัซซี่ ควรเป็นโปรแกรมหรือฟังก์ชั่นที่รับ (ผ่าน stdin, ฟังก์ชั่นอาร์กิวเมนต์หรือบรรทัดคำสั่ง) สตริงSและรายการของสตริงL, จัดรูปแบบตามที่คุณต้องการและส่งกลับหรือพิมพ์ผลลัพธ์ของการเรียกใช้โปรแกรมค้นหาฟัซซี่ การค้นหาควรคำนึงถึงขนาดตัวพิมพ์ ผลลัพธ์ที่Sอยู่ในตำแหน่งเดียวกันในหลาย ๆ สายอาจจะเรียงลำดับตามที่คุณต้องการ

ตัวอย่าง:

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

นี่คือรหัสกอล์ฟดังนั้นทางออกที่สั้นที่สุดชนะ


เราสามารถสมมติว่าการป้อนข้อมูลทั้งหมดเป็นตัวพิมพ์เล็กหรือไม่หรือเราควรจะจับคู่ตัวพิมพ์ใหญ่สำหรับกรณีบนด้วย?
Kade

1
@ Vioz- ไม่; การค้นหาจะต้องตรงตามตัวพิมพ์ใหญ่ - เล็ก ฉันอัปเดตคำถามและตัวอย่าง
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

Python 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(อาร์เรย์ของสตริง) Stack Snippet ด้านล่างมีโค้ดที่ไม่ได้รับการแปลงเป็น 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เพื่อค้นหา substrings ทั้งหมดของความยาวของ S สำหรับองค์ประกอบปัจจุบันGและจากนั้นxเพื่อหาดัชนีของการเกิดขึ้นครั้งแรกของ S แต่ฉันดูเหมือนจะไม่สามารถตั้งแลมบ์ดาได้อย่างถูกต้อง


ตรวจสอบและz Qการใช้มันจะช่วยให้คุณได้ 18 ไบต์ทันที และคุณสามารถลบlin VlK=> 17 bytes ( ลิงก์ )
Jakube

แต่รหัสของคุณใช้ไม่ได้ ลองใช้กรณีทดสอบ:imig mig migd do Mig imig
Jakube

ฉันมีวิธีแก้ปัญหาทำงาน 9 ไบต์ หากคุณต้องการความช่วยเหลือใน Pythe ให้เข้าร่วมการแชท
Jakube

โอ้เยี่ยมเลย! ฉันจะพยายามหาวิธีที่คุณทำในคืนนี้ ขอบคุณสำหรับความช่วยเหลือ! (จะต้องได้รับ 1 คะแนนชื่อเสียงมากขึ้นก่อนที่ฉันจะสามารถแชทได้: P)
cmxu

1
@ Changming ทำให้คุณมีประเด็น :)
kirbyfan64sos

2

JavaScript ( ES6 ), 68

เกือบจะเหมือนกันกับคำตอบ @NBM (แม้ว่าจะไม่ได้คัดลอก) ดังนั้นฉันจึงไม่คาดหวัง upvotes เพลิดเพลินไปกับตัวอย่าง

ฟังก์ชั่นที่มีสตริงและอาร์กิวเมนต์อาร์เรย์สตริงส่งคืนอาร์เรย์สตริง กรองจากนั้นเรียงลำดับ

ทดสอบ runnign ส่วนย่อยด้านล่าง (เป็น 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

ORACLE, 60

สิ่งนี้นับหรือไม่

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


สามารถนับได้ แต่จะต้องเป็นโพรซีเดอร์ของออราเคิลที่รับข้อมูลเป็นอาร์กิวเมนต์
kirbyfan64sos

ไม่ว่าจะนับหรือไม่ก็ฉันคิดว่ามันเท่ห์ โซลูชั่นกอล์ฟรหัสแรกที่ฉันเข้าใจจริงๆ การทำงานที่ดี!
โทมัสเวลเลอร์

@ThomasWeller ขอบคุณ! รหัสนักกอล์ฟเหล่านี้จะสดใสอย่างแน่นอน แต่บางครั้ง KISS ก็เป็นสิ่งที่คุณต้องการ!
MonkeyZeus

2

Haskell, 129 116

116 (ขอบคุณ 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)))

มันค่อนข้างยาวบางทีฉันอาจจะหาวิธีทำให้สั้นลงสักหน่อย ...


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 Bytes

ฉันเพิ่งสร้างฟังก์ชั่นที่ใช้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 มีพื้นสิ่งเดียวกันในห่อแตกต่างกันเล็กน้อย ฉันจะโหวตให้คุณแทนเพราะคิดถึงวิธีแก้ปัญหาแบบเดียวกับฉัน;)
daniero

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

Pip 15 ไบต์

โค้ด 14 ไบต์, +1 สำหรับการ-pตั้งค่าสถานะ

Yq_@?ySKyN_FIg

รับรายการเป็นบรรทัดคำสั่ง args และสตริงจาก 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.