Considerar
[
"ABCD"
"EFGH"
"IJKL"
]
Para obtener la diagonal principal y las diagonales por encima, podemos desplazar el primer carácter de la segunda fila y los dos primeros de la tercera:
[
"ABCD"
"FGH"
"KL"
]
Tenga en cuenta que todas las columnas corresponden a una diagonal, por lo que "comprimir" la matriz (es decir, transponer filas y columnas) producirá una matriz que contiene las cuatro diagonales mencionadas anteriormente:
[
"AFK"
"BGL"
"CH"
"D"
]
Todavía nos faltan las diagonales debajo de la diagonal principal.
Si comprimimos A y repetimos el proceso anterior, obtendremos una matriz que contiene la diagonal principal y todas las diagonales debajo de ella. Todo lo que queda para calcular la unión establecida de ambas matrices.
Poniendolo todo junto:
[.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.
Pruébalo en línea.
Finalmente, si solo necesitamos las diagonales porque estamos buscando una cadena dentro de ellas (como en el Word Search Puzzle , que supongo que inspiró esta pregunta), un enfoque "menos limpio" también podría ser adecuado.
Puedes usar
..,n**\.0=,\,+)/zip
para obtener todas las diagonales, además de algunos caracteres innecesarios de salto de línea.
He explicado el proceso en detalle en esta respuesta .
Pruébalo en línea.