Cách tìm kiếm mã của người chơi


15

Thử thách:

Tôi có hàng ngàn bài hát trong bộ sưu tập nhạc của mình và may mắn cho tôi, trình phát yêu thích của tôi có chức năng tìm kiếm. Tôi cũng có một trí nhớ tuyệt vời, tôi có thể nhớ tiêu đề của mỗi bài hát trong bộ sưu tập của mình. Tuy nhiên, tôi rất lười biếng và không thích gõ vào mỗi lần gõ phím thêm là một việc vặt!

  • Chuỗi ngắn nhất tôi phải tìm kiếm để cô lập một bài hát là gì? Giúp tôi ghi nhớ một danh sách các phím tôi có thể sử dụng để giảm thiểu việc gõ khi tìm kiếm!

Đây là , vì vậy mã ngắn nhất sẽ thắng.


Quy tắc:

Đưa ra một danh sách đầu vào của các tiêu đề bài hát, tạo một danh sách các khóa tìm kiếm theo các ràng buộc sau:

  1. Mỗi tên bài hát nên có một khóa tìm kiếm.
  2. Tổng số ký tự trong danh sách đầu ra phải càng ít càng tốt.
  3. Trình phát nhạc yêu thích của tôi là foobar2000 :
    • Chức năng tìm kiếm không phân biệt chữ hoa chữ thường. ( applegiống như aPpLE).
    • Mỗi khóa tìm kiếm phải bao gồm một hoặc nhiều "từ", theo bất kỳ thứ tự nào, được phân tách bằng dấu cách:
      • Mỗi từ phải là một chuỗi con của tiêu đề bài hát tương ứng.
      • Nếu cùng một chuỗi con được chỉ định nhiều lần, thì nó phải xuất hiện nhiều lần trong tiêu đề bài hát tương ứng của nó.
      • Nếu một chuỗi con tự nó chứa một khoảng trắng, thì chuỗi con đó phải được bao quanh bằng dấu ngoặc kép.

Gợi ý:

  • Thông thường, đối với một số tên bài hát, có nhiều quy tắc đáp ứng cuộc họp 2. Trong trường hợp như vậy, bất kỳ một phím nào cũng được, nhưng bạn sẽ nhận được điểm brownie để liệt kê tất cả.
  • Bạn có thể cho rằng danh sách đầu vào sẽ chỉ có các ký tự ASCII, nhưng điểm brownie sẽ được trao cho khả năng tương thích UTF-8.
  • Quy tắc 3 có khó thực hiện không? Đây là cách nó hoạt động:


Thí dụ:

Nếu bộ sưu tập nhạc của tôi chỉ bao gồm hai album, thì Michael Jackson's Off the WallThriler :

Bạn có thể sử dụng các danh sách trên để kiểm tra chương trình của bạn. Đây là phiên bản thô của danh sách thứ hai:

["Don't Stop 'Til You Get Enough","Rock with You","Working Day and Night","Get on the Floor","Off the Wall","Girlfriend","She's out of My Life","I Can't Help It","It's the Falling in Love","Burn This Disco Out","Wanna Be Startin' Somethin'","Baby Be Mine","The Girl Is Mine","Thriller","Beat It","Billie Jean","Human Nature","P.Y.T. (Pretty Young Thing)"]

1
Bạn có một ví dụ yêu cầu nhiều chuỗi cho một khóa không?
Jonathan Allan

1
Thế còn ["Wanta Be A Wanna B","Wanta Bea A Wanna B","Wanna Be A Wanna Bea"]?
Jonathan Allan

... nhưng họ nên / họ có thể là gì nếu không có khoảng trắng nào được phép trong các chuỗi con - lưu ý rằng tất cả các từ đều va chạm.
Jonathan Allan

Tại sao là phiên bản thô trong một spoiler?
Leaky Nun

Câu trả lời:


4

Python 2, 556 byte

Hãy thử trực tuyến.

-10 byte, nhờ @Riker, @ovs

Đã cho tôi vài buổi tối để làm cho mọi thứ hoạt động.
Xuất ra tên bài hát, mảng phím tìm kiếm và chiều dài của khóa tìm kiếm được kết hợp (bao gồm khoảng trắng và dấu ngoặc kép)

import re
S=map(str.lower,input())
T=len
for s in S:
 y=s;n=T(s)
 def R(r,t):
    global n,y
    l=T(' '.join(t))+2*sum(map(lambda x:' 'in x,t))
    if l>n:return
    if(lambda K:T([s for s in S if T(s)-T(reduce(lambda x,y:re.sub(re.escape(y),'',x,1),K,s))==T(''.join(K))])==1)(t)and l<n:y=t;n=l
    u=[(lambda s,n:n and[''.join(y) for y in eval('zip(s%s)'%(''.join(',s[%s:]'%-~x for x in range(n))))]or list(s))(r,i)for i in range(T(r))]
    for i in range(T(r)):
     for j in range(T(r)-i):R(r[j+T(u[i][j]):],t+[u[i][j]])
 R(s,[])
 print[' 'in x and'"%s"'%x or x for x in y]

Một số giải thích:

T=len

Hàm len()được sử dụng rất thường xuyên ở đây, vì vậy việc đổi tên này giúp tiết kiệm byte


L=lambda s,n:n and[''.join(y) for y in eval('zip(s%s)'%(''.join(',s[%s:]'%-~x for x in range(n))))]or list(s)

Đánh giá tất cả các chuỗi con có thể có của chuỗi s chiều dài n.
eval(...)tạo lệnh zip(s,s[1:],s[2:],...,s[n:])
Nó tạo các chuỗi con của chiều dài ntừ mọi chỉ số snếu có thể. Vì vậy, cho s='budd'n='2'nó sẽ sản xuất bu, ud, dd


F=lambda K:len([s for s in S if len(s)-len(reduce(lambda x,y:re.sub(re.escape(y),'',x,1),K,s))==len(''.join(K))])==1

Bộ lọc để kiểm tra xem các phím được cung cấp (K) có phải là tên bài hát duy nhất không.
re.sub được yêu cầu cho nhiều khóa giống nhau, như ['nn', 'nn'] trong các ví dụ.


Hàm bên trong def R(r,t)là một hàm đệ quy để tạo tất cả các kết hợp chuỗi con có thể, có thể mô tả tên bài hát.
Mọi kết hợp được so sánh với kết hợp ngắn nhất hiện tại (nếu có) với số lượng kết hợp được tạo thấp hơn - nếu nó lớn hơn, nó sẽ không được chấp nhận vì tất cả các dẫn xuất của nó.
Hàm sử dụng 2 biến để theo dõi trạng thái: ncho chiều dài của tổ hợp phím ngắn nhất hiện tại và ycho chính tổ hợp


l=T(' '.join(t))+2*sum(map(lambda x:' 'in x,t))

Điều này tính toán độ dài của tổ hợp phím. ' '.jointhêm khoảng trắng giữa các khóa và 2*sum(...)tính toán số lượng trích dẫn cần thiết cho các phím có khoảng trắng.


u=[L(r,i)for i in range(0,T(r))]

Sử dụng hàm lambda đầu tiên để có được tất cả tổ hợp phím có thể (của mọi độ dài có thể) cho chuỗi hiện tại.


Hai cho các chu kỳ để xem qua tất cả các khóa được tạo và chuyển chúng riêng lẻ sang bước đệ quy tiếp theo. Vị trí khóa ( j) là cần thiết để cắt chính xác chuỗi ở cuối chuỗi : r[j+T(u[i][j]):].
Slice cung cấp chuỗi, bắt đầu khi khóa hiện tại kết thúc, do đó sẽ không có bất kỳ sự chồng chéo nào.
Nếu không xác định được vị trí, các phím bằng nhau sẽ làm rối tung mọi thứ.


[' 'in x and'"%s"'%x or x for x in y]

Dài hơn nhiều so với chỉ y, nhưng các phím có khoảng trắng nên được bao quanh bởi dấu ngoặc kép


Thật đáng kinh ngạc. Bạn là người đầu tiên có được quy tắc 3 đúng!
ayane

1
Nhân tiện, bạn sẽ có thể cạo sạch hai byte bằng cách xóa 0,một trong các phạm vi của bạn: u=[L(r,i)for i in range(0,T(r))]=> u=[L(r,i)for i in range(T(r))].
notjagan

1
Bạn có thể lưu thêm một vài byte: trong đầu ra của bạn, bạn không phải hiển thị các chuỗi đầu vào và kích thước của các chuỗi đầu ra.
ayane

@ 彩 M Cảm ơn! Tôi đã cắt vài byte này từ phạm vi và đầu ra.
Dead Possum

1
S=map(str.lower,input())cho -5 byte
ovs
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.