Xem xét
[
"ABCD"
"EFGH"
"IJKL"
]
Để có được đường chéo chính và các đường chéo phía trên nó, chúng ta có thể dịch chuyển char đầu tiên của hàng thứ hai và hai đầu tiên của thứ ba:
[
"ABCD"
"FGH"
"KL"
]
Lưu ý rằng tất cả các cột tương ứng với một đường chéo, do đó, "nén" mảng (nghĩa là các hàng và cột hoán vị) sẽ tạo ra một mảng chứa bốn đường chéo đã nói ở trên:
[
"AFK"
"BGL"
"CH"
"D"
]
Chúng ta vẫn còn thiếu các đường chéo bên dưới đường chéo chính.
Nếu chúng ta nén chính A và lặp lại quy trình trên, chúng ta sẽ có được một mảng chứa đường chéo chính và tất cả các đường chéo bên dưới nó. Tất cả chỉ còn lại nó để tính tập hợp của cả hai mảng.
Để tất cả chúng cùng nhau:
[.zip]{:A,,{.A=>}%zip}/|
[.zip]{ }/ # For the original array and it's transpose, do the following:
:A # Store the array in A.
,,{ }% # For each I in [ 0 1 ... len(A) ], do the following:
.A=> # Push A[I] and shift out its first I characters.
zip # Transpose the resulting array.
| # Perform set union.
Hãy thử trực tuyến.
Cuối cùng, nếu chúng ta chỉ cần các đường chéo vì chúng ta đang tìm kiếm một chuỗi bên trong chúng (như trong Câu đố tìm kiếm từ mà tôi cho là đã truyền cảm hứng cho câu hỏi này), một cách tiếp cận "ít sạch hơn" cũng có thể phù hợp.
Bạn có thể dùng
..,n**\.0=,\,+)/zip
để có được tất cả các đường chéo, cộng với một số ký tự dòng không cần thiết.
Tôi đã giải thích quá trình chi tiết trong câu trả lời này .
Hãy thử trực tuyến.