Erwägen
[
"ABCD"
"EFGH"
"IJKL"
]
Um die Hauptdiagonale und die darüber liegenden Diagonalen zu erhalten, können wir das erste Zeichen der zweiten Reihe und die ersten beiden der dritten Reihe verschieben:
[
"ABCD"
"FGH"
"KL"
]
Beachten Sie, dass alle Spalten einer Diagonale entsprechen. Wenn Sie also das Array "zippen" (dh Zeilen und Spalten transponieren), erhalten Sie ein Array mit den oben genannten vier Diagonalen:
[
"AFK"
"BGL"
"CH"
"D"
]
Wir vermissen immer noch die Diagonalen unterhalb der Hauptdiagonale.
Wenn wir A selbst komprimieren und den obigen Vorgang wiederholen, erhalten wir ein Array, das die Hauptdiagonale und alle darunter liegenden Diagonalen enthält . Alles, was übrig bleibt, um die Mengenvereinigung beider Arrays zu berechnen.
Alles zusammen:
[.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.
Probieren Sie es online aus.
Wenn wir nur die Diagonalen benötigen, weil wir nach einer Zeichenfolge in ihnen suchen (wie im Wortsuchrätsel , von dem ich annehme , dass es diese Frage inspiriert hat), ist möglicherweise auch ein "weniger sauberer" Ansatz geeignet.
Sie können verwenden
..,n**\.0=,\,+)/zip
um alle Diagonalen sowie einige unnötige Zeilenvorschubzeichen zu erhalten.
Ich habe den Prozess in dieser Antwort ausführlich erklärt .
Probieren Sie es online aus.