Trình giải từ tìm kiếm


13

Tôi đã tự hỏi ngày hôm qua nếu tôi có thể viết một chương trình để kết hợp thông qua một tìm kiếm từ nhất định và đưa ra câu trả lời. Nó thực sự dễ dàng đáng ngạc nhiên. Bây giờ tôi tự hỏi làm thế nào nhỏ chúng ta có thể nhận được.

Quy tắc

  • Đầu vào đầu tiên của bạn là một chuỗi hoặc tập hợp gồm n dòng, mỗi dòng dài n ký tự
  • Đầu vào thứ hai của bạn là một danh sách các từ ở bất kỳ định dạng nào cần tìm trong câu đố
  • Tất cả các từ trong danh sách tìm kiếm được đảm bảo có trong câu đố
  • Các từ có thể được định hướng theo bất kỳ hướng nào trong bốn hướng chính, cũng như theo đường chéo cả về phía trước và phía sau
  • Chỉ các ký tự chữ hoa chữ thường sẽ có mặt trong câu đố
  • Mã của bạn phải tìm mọi từ trong chuỗi tìm kiếm và xuất vị trí tọa độ của chữ cái bắt đầu, trong đó 0,0 là ký tự trên cùng bên trái.
  • Trong trường hợp bạn định vị nhiều hơn một thể hiện của cùng một từ, bạn có thể xử lý nó theo cách bạn muốn. Xuất nó nhiều lần, hoặc chỉ một lần, tùy bạn

Ví dụ / Trường hợp kiểm tra

Đưa ra bảng sau:

ABCD
EFGH
IJKL
MNOP

Và chuỗi tìm kiếm sau:

ABCD,CGKO,POMN,NJF,AFKP,CFI,LGB,MJGD

Chương trình của bạn sẽ xuất ra các mục sau, theo bất kỳ thứ tự nào:

ABCD at 0,0
CGKO at 0,2
PONM at 3,3
NJF at 3,1
AFKP at 0,0
CFI at 0,2
LGB at 2,3
MJGD at 3,0

Như mọi khi, câu trả lời ngắn nhất sẽ thắng


6
Chào mừng đến với PPCG! Thử thách đầu tiên tốt đẹp!
admBorkBork

2
Tương tự , sự khác biệt thực sự duy nhất dường như là sự bao gồm của vị trí trong đầu ra.
FryAmTheEggman

@ NL628 Có, tất cả các từ tìm kiếm được đảm bảo có trong câu đố. Nếu có nhiều hơn một lần xuất hiện, bạn có thể xuất cả hai lần hoặc bỏ qua lần thứ hai, tùy bạn.
morpen

@Jonathan ALLan Ý tưởng tuyệt vời. Tôi sẽ cập nhật nó như bạn đề xuất.
morpen

1
@RickHitchcock Có nên :)
morpen

Câu trả lời:


4

JavaScript (Node.js) , 154 152 150 141 byte

  • cảm ơn Arnauld vì đã giảm 2 byte

trả về mảng các vị trí (trước đây là một chuỗi với các dòng mới)

(b,w)=>w.map(s=>[...b].map((_,p)=>[1,-1,r=b.search`
`,-r,~r,++r,-~r,~r].map(d=>[...s].every((c,i)=>c==b[p+d*i])?s+=" at "+[p/r|0,p%r]:0))&&s)

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


3

Python 2 , 213 byte

lambda a,W:[(w,i,j)for w in W for i in R(L(a))for j in R(L(a[0]))for U in R(9)if U-4and g(i,j,U/3-1,U%3-1,a).find(w)==0]
g=lambda i,j,u,v,a,s='':L(a)>i>=0<=j<L(a[0])and g(i+u,j+v,u,v,a,s+a[i][j])or s
L=len;R=range

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

g có một vị trí bắt đầu i,j và một hướng u,vvà thông qua đệ quy trích xuất chuỗi bắt đầu tại vị trí đó theo hướng đó.

fsau đó truy cập từng vị trí i,jvà hướng bắt đầu U/3-1,U%3-1và kiểm tra từng từ wđể xem chuỗi kết quả bắt đầu bằng w.


2

Python 3 , 149 147 byte

def g(b,w):h=b.find('\n')+1;return[f'{y} at {i//h},{i%h}'for y in w for i in range(len(b))for d in(1,h+1,h,h-1,-1,~h,-h,1-h)if y==b[i::d][:len(y)]]

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

Phiên bản ung dung

def g(b,w):
    h = b.find('\n') + 1                              # width of a row plus the '\n'
    a = []
    for y in w:                                       # iterate over the words
        for i in range(len(b)):                       #   iterate over the game board
            for d in(1,h+1,h,h-1,-1,~h,-h,1-h):       #     for each possible direction
                if y==b[i::d][:len(y)]:               #       see if the word matches
                    a.append(f'{y} at {i//h},{i%h}')
    return a

Ý tưởng chính là b[i::d]chọn một lát cắt từ bảng trò chơi. Các lát cắt bắt đầu như vị trí ivà mở rộng theo hướng d. Ví dụ, d = h+1tương ứng với đường chéo phía đông nam, trong khi đó d = ~h, tương tự như -h-1, tương ứng với đường chéo phía tây bắc. [:len(y)] cắt các lát cắt ở cùng độ dài với từ đang tìm kiếm.

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.