Triển khai một Fuzzy Downloader


14

Lấy cảm hứng từ liên kết này, tôi tìm thấy trên Reddit .

Một Fuzzy Downloader là một tính năng của nhiều trình soạn thảo văn bản. Khi bạn bắt đầu nhập một đường dẫn tệp S, Fuzzy Downloader sẽ khởi động và hiển thị cho bạn tất cả các tệp trong thư mục hiện tại có chứa chuỗi bạn đã nhập, được sắp xếp theo vị trí của Stệp.

Nhiệm vụ của bạn là thực hiện một công cụ tìm mờ. Nó phải là chương trình hoặc hàm lấy (thông qua stdin, đối số hàm hoặc dòng lệnh) một chuỗi Svà danh sách các chuỗi L, được định dạng theo cách bạn muốn và trả về hoặc in kết quả của việc chạy công cụ tìm mờ. Việc tìm kiếm phải phân biệt chữ hoa chữ thường. Kết quả Sở cùng một vị trí trong nhiều chuỗi có thể được sắp xếp theo cách bạn muốn.

Thí dụ:

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

Đây là mã golf, vì vậy giải pháp ngắn nhất sẽ thắng.


Chúng ta có thể giả sử tất cả các đầu vào là chữ thường, hoặc chúng ta nên kết hợp mờ cho chữ hoa?
Kade

1
@ Vioz- Không; việc tìm kiếm phải phân biệt chữ hoa chữ thường. Tôi đã cập nhật câu hỏi và ví dụ.
kirbyfan64sos

Câu trả lời:


5

Bình thường, 9 byte

oxNzf}zTQ

Dùng thử trực tuyến: Trình diễn

Giải trình:

            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
Đây là chương trình Pyth chính xác giống như tôi đã có trong quá trình thử nghiệm. :)
kirbyfan64sos

5

Con trăn 2, 65

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

Biểu thức x.find(s)trả về vị trí xuất hiện đầu tiên của sin x, -1không cho khớp. Chúng tôi thêm 1vào kết quả là không có kết quả tương ứng 0, cho phép chúng tôi filterra ngoài. Sau đó chúng tôi sắp xếp theo vị trí khớp, không bị ảnh hưởng bằng cách dịch chuyển 1.


5

CJam, 18 15 byte

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

Hãy thử trực tuyến trong trình thông dịch CJam .

Tôi / O

Đầu vào:

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

Đầu ra:

["mig" "migd" "imig"]

Làm thế nào nó hoạt động

      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 byte

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

Đây là một trong những trường hợp hiếm hoi mà GolfScript có thể đánh bại CJam, bằng cách sử dụng nối khối và lấy một vài quyền tự do với đầu vào có thể được định dạng theo cách bạn muốn .

Dùng thử trực tuyến trong Web GolfScript .

Tôi / O

Đầu vào

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

Đầu ra

["migd" "mig" "imig"]

Làm thế nào nó hoạt động

~             # 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 byte

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

Đây là một hàm ẩn danh nhận tham số s(chuỗi đường dẫn tệp) và l(mảng chuỗi). Đoạn mã dưới đây chứa mã không được chuyển đổi thành ES5 để nhiều người có thể kiểm tra dễ dàng hơn. (Nếu bạn có Firefox, bạn có thể sử dụng bộ kiểm tra đẹp hơn của edc65 trong câu trả lời của anh ấy.)

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>


Ồ ngớ ngẩn tôi mất thời gian chuẩn bị một bộ thử nghiệm!
edc65

3

[Giữ] Pyth, 24 byte

JwKcwdVlK=G.)KI}JGaYG))Y

Thử ở đây

Tôi khá mới ở Code Golfing / Pyth vì vậy tôi không chắc nó tối ưu, nhưng tôi đang làm việc trên nó!

Cập nhật: Tôi không nghĩ rằng tôi thực sự sắp xếp chính xác và dường như tôi không thể làm cho nó hoạt động. Tôi biết đó olà theo thứ tự và tôi cần sắp xếp theo vị trí của S vì vậy tôi đang sử dụng .:GlJđể tìm tất cả các chuỗi con của độ dài S cho phần tử hiện tại Gvà sau đó xđể tìm chỉ số của lần xuất hiện đầu tiên của S, nhưng tôi dường như không thể đặt lambda chính xác.


Kiểm tra zQ. Sử dụng chúng cung cấp cho bạn ngay lập tức 18 byte. Và bạn có thể xóa lin VlK=> 17 byte ( liên kết )
Jakube

Btw, mã của bạn không hoạt động. Hãy thử trường hợp thử nghiệm:imig mig migd do Mig imig
Jakube

Tôi có một giải pháp 9 byte làm việc. Nếu bạn muốn bất kỳ trợ giúp trong Pyth, tham gia trò chuyện.
Jakube

Ồ tuyệt! Tôi sẽ cố gắng tìm ra cách bạn đã làm nó tối nay. Cảm ơn vì sự giúp đỡ! (Gonna cần kiếm thêm 1 điểm danh tiếng trước khi tôi có thể trò chuyện: P)
cmxu

1
@Changming Đã cho bạn điểm. :)
kirbyfan64sos

2

JavaScript ( ES6 ), 68

Điều đó gần giống với câu trả lời @NBM (ngay cả khi nó không được sao chép), vì vậy tôi không mong đợi các câu trả lời. Hãy tận hưởng đoạn trích nào

Một hàm với một chuỗi và một đối số mảng chuỗi, trả về một mảng chuỗi. Lọc rồi sắp xếp.

Kiểm tra chạy đoạn mã bên dưới (là EcmaScript 6, chỉ dành cho 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

Điều này có tính không?

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


Nó có thể được tính, nhưng nó sẽ cần là một thủ tục của Oracle lấy dữ liệu làm đối số.
kirbyfan64sos

Cho dù nó có tính hay không, tôi nghĩ nó thật tuyệt. Các giải pháp golf mã đầu tiên bao giờ tôi thực sự hiểu. Công việc tuyệt vời
Thomas Weller

@ThomasWeller Cảm ơn! Những người chơi golf mã này chắc chắn có thể rất sáng nhưng đôi khi KISS là tất cả những gì bạn cần!
MonkeyZeus

2

Haskell, 129 116

116 (Cảm ơn 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)))

Chà, nó khá dài, có lẽ tôi sẽ tìm cách rút ngắn lại một chút ...


1
cạo râu ngày 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 byte

Tôi vừa tạo một hàm lấy schuỗi để khớp trong danh sách các chuỗin

Chỉnh sửa 1: Cảm ơn Jakube vì đã chơi golf một byte.

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

Kiểm tra nó ở đây.


1

Ruby, 63

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

Chạy

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

Ghi chú

  1. Trước tiên hãy tìm tất cả các từ khớp với find_all
  2. Sắp xếp theo vị trí chỉ mục của từ cần tìm kiếm.

Chỉnh sửa (bởi daneiro)

Ruby, 49

p=->w,l{l.select{|x|x[w]}.sort_by{|e|e.index(w)}}

1
Điều tương tự trong 49 ký tự:p=->w,l{l.select{|x|x[w]}.sort_by{|e|e.index(w)}}
daniero

@daniero Xin vui lòng gửi nó như là câu trả lời của bạn. Tôi sẽ upvote!
bsd

1
Không, thực sự ổn :) Phiên bản của tôi chỉ là một cải tiến của bạn, tôi nghĩ chúng quá giống nhau để trở thành câu trả lời riêng biệt. selectlà một bí danh cho find_all,sortsort_by về cơ bản những điều tương tự trong bao bì hơi khác nhau. Thay vào đó, tôi sẽ ủng hộ bạn vì đã nghĩ ra giải pháp tương tự như tôi;)
daniero

0

Vợt 46 byte

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

Sử dụng:

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

Kiểm tra:

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

Đầu ra:

'("imig" "mig" "migd")


0

Đường ống , 15 byte

14 byte mã, +1 cho -pcờ.

Yq_@?ySKyN_FIg

Lấy danh sách dưới dạng đối số dòng lệnh và chuỗi từ stdin. Hãy thử trực tuyến!

Giải trình

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.