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 \n
s 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, l
là 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, i
tươ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+1
theo gia số của +1
nếu start1<end1
hoặc -1
nếu ngược lại là đúng. Tuy nhiên, i
chỉ tương ứng với điều này miễn là start1
không bằng end1
. Mặt khác start1
được trả về nhiều lần bằng độ dài của m
, trong đó m
một đối tượng phạm vi chứa mỗi số nguyên trong phạm vi start2=>end2+1
có cùng điều kiện n
và p
tươ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,0
trê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à APPLE
nế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!