Tìm các từ trên lưới!


8

Viết chương trình hoặc hàm trích xuất một từ từ tìm kiếm bằng cách sử dụng tọa độ bắt đầu và kết thúc của nó.

Đầu vào

Chương trình hoặc hàm của bạn phải chấp nhận ba tham số: tọa độ bắt đầu , tọa độ kết thúctìm kiếm từ để trích xuất từ ​​đó.

  • Các tọa độ bắt đầu có thể được thực hiện trong bất kỳ định dạng.

    • Nó sẽ luôn là một số nguyên

    • Phía dưới bên trái của lưới là (0, 0)

    • Bạn sẽ không được cung cấp tọa độ đi ra ngoài giới hạn của lưới

    • Bạn sẽ không được cung cấp các tọa độ không thẳng đứng, nằm ngang hoặc đường chéo hoàn hảo với nhau, chẳng hạn như (7, 0) và (0, 6).

  • Các cuối tọa độ sẽ được thực hiện trong các định dạng giống như bắt đầu phối hợp

  • Các từ tìm kiếm sẽ là một chuỗi hoặc tương đương gần nhất với ngôn ngữ của bạn

    • Nó sẽ là một lưới các ký tự được phân tách bằng một khoảng trắng , với mỗi hàng trên một dòng mới . Nó có thể có bất kỳ chiều cao hoặc chiều rộng - có thể khác nhau - nhưng nó sẽ luôn là một hình chữ nhật . Ví dụ:

      A G O A T C A T
      E A T M E N O W
      W O R D S E A R
      A K L L K J H G
      N P L F G H F D
      A S P L K J H G
      O P I L F G H J
      T F A S E J K L
      
      J H P B L D J L T
      F J L N F N P W H
      W P R D T F J R Q
      J L L L L J H H W
      N P L F H H F D S
      J T P L L J H H K
      P P J L F H H J N
      L F J T F J L L O
      

Đầu ra

Bạn nên xuất một chuỗi hoặc tương đương gần nhất với ngôn ngữ của bạn. Vì không có từ nào trong cuộc sống thực bao giờ yêu cầu tìm một chữ cái duy nhất, bạn có thể không xuất ra gì nếu tọa độ giống nhau.

Ví dụ và trường hợp thử nghiệm

Lưới đầu tiên ở trên:
(0, 4) và (4, 0) -> "APPLE"

(4, 0) và (0, 4) -> "ELPPA"

(1, 7) và (4, 7) -> "ĐI"

(0, 5) và (7, 5) -> "TỪ NGÀY"

(0, 6) và (5, 6) -> "ĂN"

(0, 6) và (0, 7) -> "EA"

(7, 0) và (0, 7) -> "LHJGLRAA"

----------

Lưới thứ hai ở trên:
(1, 0) và (8, 7) -> "FJLHJJWT"


(1, 4) và (4, 4) -> "LLLL"

(1, 4) và (1, 4) -> "L" hoặc ""


2
Bạn nên định dạng các trường hợp thử nghiệm khác nhau. Đây là cách quá nhiều văn bản lặp đi lặp lại. Chỉ cần chia chúng thành hai lưới và đi với một cái gì đó như (1,4),(4,4)-> "LLLL"
Denker

@DenkerAffe Done :)
reubn

Tôi có thể lấy từ đó làm danh sách liệt kê không?
Máy

Trường hợp kiểm tra 4 không chính xác. Đầu ra chính xác là "WORDSEAR"
CalculatorFeline

Câu trả lời:


2

JavaScript (ES6) 108

(x,y,t,u,g)=>eval("for(g=g.split`\n`.reverse(),r=g[y][2*x];x-t|y-u;)r+=g[y+=u<y?-1:u>y][2*(x+=t<x?-1:t>x)]")

Ít chơi gôn

(x,y,t,u,g)=>{
    g=g.split`\n`.reverse();
    for(r = g[y][2*x]; x-t | y-u; )
        r+=g[y += u<y ? -1 : u>y][2*( x += t<x ? -1 : t>x)];
    return r
}   

0

Python 3.5 sử dụng Numpy, 251 byte:

def r(t,y,z):import numpy;l=numpy.array([[*i.split()]for i in z.split('\n')]);A,B,C,D=t[0],y[0],t[1],y[1];p=[1,-1];a=p[A>B];b=p[C>D];n=range(A,B+a,a);m=range(C,D+b,b);w=[l[:,i][::-1][p]for i,p in zip([[A]*len(m),n][A!=B],[[C]*len(n),m][C!=D])];return w
  • Đưa đầu vào theo định dạng sau:

    print(''.join(r((start1,start2),(end1,end2),'''grid''')))
    
  • Các đầu ra ở định dạng của một chuỗi (ví dụ APPLE) miễn là hàm được gọi bằng định dạng trên. Mặt khác, một danh sách chứa mỗi chữ cái (ví dụ ['A','P','P','L','E']) được trả về.

Sẽ chơi golf nhiều hơn theo thời gian ở đâu và khi nào tôi có thể.

Dùng thử trực tuyến! (Ideone) (Ở đây, đầu vào được lấy sao cho lưới được bao quanh bằng dấu ngoặc kép ( "") và đầu vào trên một dòng, với \ns giữa mỗi dòng của lưới. Sau đó, các điểm được cung cấp ở dạng tuple đơn giản, bắt đầu trên dòng thứ hai và kết thúc trên dòng thứ ba.)

Mã bị hủy cùng với Giải thích

def r(t,y,z):
    import numpy
    l=numpy.array([[*i.split()]for i in z.split('\n')])
    A,B,C,D=t[0],y[0],t[1],y[1]
    p=[1,-1]
    a=p[A>B]
    b=p[C>D]
    n=range(A,B+a,a)
    m=range(C,D+b,b)
    w=[l[:,i][::-1][p]for i,p in zip([[A]*len(m),n][A!=B],[[C]*len(n),m][C!=D])]
    return w

Đối với mục đích của lời giải thích này, giả sử chương trình này được chạy với các đầu vào ((0,4),(4,0))và lưới đầu tiên của câu hỏi. Ở đây, tôi sẽ đi qua 2 phần chính của mã:

  • l=numpy.array([[*i.split()]for i in z.split('\n')])

    Ở đây, llà một mảng gọn gàng chứa mỗi dòng của đầu vào trong một "danh sách" riêng biệt. Chẳng hạn, lưới đầu tiên trong câu hỏi, đó là:

    A G O A T C A T
    E A T M E N O W
    W O R D S E A R
    A K L L K J H G
    N P L F G H F D
    A S P L K J H G
    O P I L F G H J
    T F A S E J K L
    

    trả về mảng numpy này:

    [['A' 'G' 'O' 'A' 'T' 'C' 'A' 'T']
     ['E' 'A' 'T' 'M' 'E' 'N' 'O' 'W']
     ['W' 'O' 'R' 'D' 'S' 'E' 'A' 'R']
     ['A' 'K' 'L' 'L' 'K' 'J' 'H' 'G']
     ['N' 'P' 'L' 'F' 'G' 'H' 'F' 'D']
     ['A' 'S' 'P' 'L' 'K' 'J' 'H' 'G']
     ['O' 'P' 'I' 'L' 'F' 'G' 'H' 'J']
     ['T' 'F' 'A' 'S' 'E' 'J' 'K' 'L']]
    
  • w=[l[:,i][::-1][p]for i,p in zip([[A]*len(m),n][A!=B],[[C]*len(n),m][C!=D])]

    Đây là danh sách chính của hàm trong đó tất cả các chữ cái tương ứng với từng điểm trên lưới được tìm thấy. Ở đây, itương ứng với mỗi số nguyên trong n, là một đối tượng phạm vi chứa mọi số trong phạm vi start1=>end1+1theo gia số của +1nếu start1<end1hoặc -1nếu ngược lại là đúng. Tuy nhiên, ichỉ tương ứng với điều này miễn là start1không bằng end1. Mặt khác start1được trả về nhiều lần bằng độ dài của m, trong đó mmột đối tượng phạm vi chứa mỗi số nguyên trong phạm vi start2=>end2+1có cùng điều kiện nptương ứng với mọi số nguyên trong m. Điều đó đang được nói, bây giờ chúng ta hãy đi qua từng bước này:

    • l[:,i]về cơ bản trả về một vectơ hàng cho mỗi cột i, trong mảng , l. ví dụ, l[:,0]sẽ trả về:

      ['A' 'E' 'W' 'A' 'N' 'A' 'O' 'T']
      

      l[:,1] sẽ trở lại:

      ['G' 'A' 'O' 'K' 'P' 'S' 'P' 'F']
      

      Vv và Vv. Bạn có thể đọc thêm về các cách lập chỉ mục khác nhau trong numpy, bao gồm cả phương pháp này, ở đây .

    • Sau đó, hàm sẽ đảo ngược từng mảng được trả về, bằng cách sử dụng l[:,i][::-1], vì mỗi mảng được lập chỉ mục từ trái sang phải, nhưng vì điểm 0,0trên lưới ở góc dưới bên trái của lưới, đảo ngược từng mảng sẽ trả về các giá trị chỉ mục như thể họ đang được tìm kiếm từ phải sang trái. Chẳng hạn, l[:,0][::-1]sẽ trả về:

      ['T' 'O' 'A' 'N' 'A' 'W' 'E' 'A']
      
    • Sau đó, hàm sau đó lập chỉ mục thông qua mảng đảo ngược đó cho giá trị chỉ mục tương ứng p, đó là chữ cái của bạn, sau đó thêm nó vào danh sách được tạo. Ví dụ, l[:,0][::-1][4]tương ứng với điểm (0,4), sẽ trả về A.

    • Quá trình này tiếp tục lặp lại và thêm các giá trị mới vào danh sách cho đến khi các đối tượng phạm vi cạn kiệt.

Sau tất cả, đầu ra, là danh sách w, cuối cùng được trả về. Trong trường hợp này, đó sẽ là APPLEnếu được gọi với print(''.join(r((0,4),(4,0),'''The Grid''')))hoặc ['A','P','P','L','E']nếu nó được gọi mà không có ''.join(). Dù bằng cách nào, nó trả về câu trả lời đúng, và chúng ta đã hoàn thành!

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.