Mempertimbangkan
[
"ABCD"
"EFGH"
"IJKL"
]
Untuk mendapatkan diagonal utama dan diagonal di atasnya, kita dapat menggeser karakter pertama dari baris kedua dan dua yang pertama dari baris ketiga:
[
"ABCD"
"FGH"
"KL"
]
Perhatikan bahwa semua kolom sesuai dengan diagonal, jadi "zipping" array (yaitu, transposing baris dan kolom) akan menghasilkan array yang berisi empat diagonal yang disebutkan di atas:
[
"AFK"
"BGL"
"CH"
"D"
]
Kami masih kehilangan diagonal di bawah diagonal utama.
Jika kita membuka zip sendiri dan mengulangi proses di atas, kita akan mendapatkan array yang berisi diagonal utama dan semua diagonal di bawahnya. Semua yang tersisa untuk menghitung gabungan set dari kedua array.
Menyatukan semuanya:
[.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.
Cobalah online.
Akhirnya, jika kita hanya perlu diagonal karena kita sedang mencari string di dalamnya (seperti dalam Puzzle Pencarian Kata , yang saya asumsikan mengilhami pertanyaan ini), pendekatan "kurang bersih" mungkin juga cocok.
Kamu bisa menggunakan
..,n**\.0=,\,+)/zip
untuk mendapatkan semua diagonal, ditambah beberapa karakter linefeed yang tidak perlu.
Saya telah menjelaskan proses secara terperinci dalam jawaban ini .
Cobalah online.