Ritenere
[
"ABCD"
"EFGH"
"IJKL"
]
Per ottenere la diagonale principale e le diagonali sopra di essa, possiamo spostare il primo carattere della seconda riga e i primi due della terza:
[
"ABCD"
"FGH"
"KL"
]
Si noti che tutte le colonne corrispondono a una diagonale, quindi "zippare" l'array (ovvero trasporre righe e colonne) produrrà un array contenente le quattro diagonali di cui sopra:
[
"AFK"
"BGL"
"CH"
"D"
]
Ci mancano ancora le diagonali sotto la diagonale principale.
Se comprimiamo A stesso e ripetiamo il processo sopra, otterremo un array contenente la diagonale principale e tutte le diagonali sottostanti . Tutto ciò che è rimasto per calcolare l'unione impostata di entrambi gli array.
Mettere tutto insieme:
[.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.
Provalo online.
Infine, se abbiamo solo bisogno delle diagonali perché stiamo cercando una stringa al loro interno (come nel Word Search Puzzle , che presumo abbia ispirato questa domanda), potrebbe anche essere adatto un approccio "meno pulito".
Puoi usare
..,n**\.0=,\,+)/zip
per ottenere tutte le diagonali, oltre ad alcuni caratteri di avanzamento riga non necessari.
Ho spiegato il processo in dettaglio in questa risposta .
Provalo online.