Рассматривать
[
"ABCD"
"EFGH"
"IJKL"
]
Чтобы получить основную диагональ и диагонали над ней, мы можем сместить первый символ второго ряда и первые два третьего:
[
"ABCD"
"FGH"
"KL"
]
Обратите внимание, что все столбцы соответствуют диагонали, поэтому «сжатие» массива (т. Е. Транспонирование строк и столбцов) приведет к массиву, содержащему вышеупомянутые четыре диагонали:
[
"AFK"
"BGL"
"CH"
"D"
]
Нам все еще не хватает диагоналей ниже основной диагонали.
Если мы застегнем A на себя и повторим описанный выше процесс, мы получим массив, содержащий основную диагональ и все диагонали под ней. Все, что осталось, это вычислить объединение множеств обоих массивов.
Собираем все вместе:
[.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.
Попробуйте онлайн.
Наконец, если нам нужны только диагонали, потому что мы ищем строку внутри них (как в « Головоломке поиска слов» , которая, как я полагаю, вдохновила этот вопрос), «менее чистый» подход также может быть подходящим.
Ты можешь использовать
..,n**\.0=,\,+)/zip
чтобы получить все диагонали, а также некоторые ненужные символы перевода строки.
Я объяснил процесс подробно в этом ответе .
Попробуйте онлайн.