Considérer
[
"ABCD"
"EFGH"
"IJKL"
]
Pour obtenir la diagonale principale et les diagonales au-dessus, nous pouvons décaler le premier caractère de la deuxième ligne et les deux premiers de la troisième:
[
"ABCD"
"FGH"
"KL"
]
Notez que toutes les colonnes correspondent à une diagonale, donc "zipper" le tableau (c'est-à-dire transposer des lignes et des colonnes) produira un tableau contenant les quatre diagonales susmentionnées:
[
"AFK"
"BGL"
"CH"
"D"
]
Il nous manque encore les diagonales sous la diagonale principale.
Si nous compressons A lui-même et répétons le processus ci-dessus, nous obtiendrons un tableau contenant la diagonale principale et toutes les diagonales en dessous . Tout ce qui reste pour calculer l'union définie des deux tableaux.
Mettre tous ensemble:
[.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.
Essayez-le en ligne.
Enfin, si nous n'avons besoin que des diagonales parce que nous recherchons une chaîne à l'intérieur (comme dans le casse - tête de recherche de mots , qui, je suppose, a inspiré cette question), une approche "moins propre" pourrait également convenir.
Vous pouvez utiliser
..,n**\.0=,\,+)/zip
pour obtenir toutes les diagonales, plus quelques caractères de saut de ligne inutiles.
J'ai expliqué le processus en détail dans cette réponse .
Essayez-le en ligne.