Rozważać
[
"ABCD"
"EFGH"
"IJKL"
]
Aby uzyskać główną przekątną i przekątne nad nią, możemy przesunąć pierwszy znak drugiego rzędu i pierwsze dwa trzeciego:
[
"ABCD"
"FGH"
"KL"
]
Zauważ, że wszystkie kolumny odpowiadają przekątnej, więc „skompresowanie” tablicy (tj. Transpozycja wierszy i kolumn) da tablicę zawierającą wyżej wymienione cztery przekątne:
[
"AFK"
"BGL"
"CH"
"D"
]
Nadal brakuje przekątnych poniżej głównej przekątnej.
Jeśli skompresujemy sam A i powtórzymy powyższy proces, otrzymamy tablicę zawierającą główną przekątną i wszystkie przekątne poniżej . Wszystko, co pozostało, to obliczyć ustawione połączenie obu tablic.
Kładąc wszystko razem:
[.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.
Wypróbuj online.
Wreszcie, jeśli potrzebujemy tylko przekątnych, ponieważ szukamy w nich łańcucha (jak w Puzzle wyszukiwania słowa , która, jak zakładam, zainspirowała to pytanie), odpowiednie może być również podejście „mniej czyste”.
Możesz użyć
..,n**\.0=,\,+)/zip
aby uzyskać wszystkie przekątne oraz niepotrzebne znaki linii.
Szczegółowo wyjaśniłem ten proces w tej odpowiedzi .
Wypróbuj online.