Considerar
[
"ABCD"
"EFGH"
"IJKL"
]
Para obter a diagonal principal e as diagonais acima dela, podemos mudar o primeiro caractere da segunda linha e os dois primeiros da terceira:
[
"ABCD"
"FGH"
"KL"
]
Observe que todas as colunas correspondem a uma diagonal; portanto, "compactando" a matriz (isto é, transpondo linhas e colunas) produzirá uma matriz contendo as quatro diagonais mencionadas acima:
[
"AFK"
"BGL"
"CH"
"D"
]
Ainda faltam as diagonais abaixo da diagonal principal.
Se fizermos o zip de A e repetirmos o processo acima, obteremos uma matriz contendo a diagonal principal e todas as diagonais abaixo dela. Tudo o que resta para calcular a união definida de ambas as matrizes.
Juntando tudo:
[.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.
Experimente online.
Por fim, se precisarmos apenas das diagonais porque estamos procurando uma string dentro delas (como no quebra-cabeça do Word Search , que suponho ter inspirado essa pergunta), uma abordagem "menos limpa" também pode ser adequada.
Você pode usar
..,n**\.0=,\,+)/zip
para obter todas as diagonais, além de alguns caracteres desnecessários de avanço de linha.
Expliquei o processo em detalhes nesta resposta .
Experimente online.