Розглянемо
[
"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.
Спробуйте в Інтернеті.
Нарешті, якщо нам потрібні лише діагоналі, оскільки ми шукаємо рядок всередині них (як, наприклад, у головоломці Word Search , яка, напевно, надихнула на це питання), може бути також підходящим "менш чистий" підхід.
Можна використовувати
..,n**\.0=,\,+)/zip
щоб отримати всі діагоналі, а також кілька непотрібних символів, що передаються в рядку.
Я детально пояснив процес у цій відповіді .
Спробуйте в Інтернеті.